np.vstack()
垂直拼接
In [1]: import numpy as np
In [2]: arr = np.arange(12).reshape(3,4)
In [3]: arr
Out[3]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [4]: arr.shape
Out[4]: (3, 4)
In [5]: # 垂直拼接需要对应的列数一样
In [6]: arr1 = np.arange(8).reshape(2,4)
In [7]: np.vstack([arr,arr1])
Out[7]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[ 0, 1, 2, 3],
[ 4, 5, 6, 7]])
np.hstack()
水平拼接
In [11]: # 垂直拼接的行数必须要一致
In [12]: # 水平拼接的列数必须要一致
In [13]: import numpy as np
In [14]: arr = np.arange(12).reshape(3,4)
In [15]: arr.shape
Out[15]: (3, 4)
In [16]: arr1 = np.arange(6).reshape(3,2)
In [17]: arr1
Out[17]:
array([[0, 1],
[2, 3],
[4, 5]])
In [18]: arr
Out[18]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [19]: np.hstack([arr,arr1])
Out[19]:
array([[ 0, 1, 2, 3, 0, 1],
[ 4, 5, 6, 7, 2, 3],
[ 8, 9, 10, 11, 4, 5]])
注意:vstack的垂直拼接的列数要一致,hstack的水平拼接的行数要一致
一维数组
一维数组很简单,基本和列表一致。它们的区别在于数组切片是原始数组视图(意味着类似于深拷贝,如果任何的修改,原始都会跟着更改)。它也意味着,如果不想更改原始数组,我们需要进行显式的复制,从而得到它的副本。
二维数组
二维数组递归方式获取
二维数组逗号分隔获取(行,列)
取单行 arr[x1,:]
取连续行 arr[x1:x2,:]
取分开行 arr[[x1,x2],:]
取子矩阵 arr[x1:x2,y1:y2]
取点 arr[[x1,x2],[y1,y2]]
In [12]: import numpy as np
In [13]: arr = np.arange(12).reshape(3,4)
In [14]: # 取单行
In [15]: arr
Out[15]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [16]: arr[1]
Out[16]: array([4, 5, 6, 7])
In [17]: # 取连续行
In [18]: arr[1:]
Out[18]:
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [19]: # 取分开行
In [20]: arr[[0,1],:]
Out[20]:
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
In [21]: arr[[0,2],:]
Out[21]:
array([[ 0, 1, 2, 3],
[ 8, 9, 10, 11]])
In [22]: # 取子矩阵
In [23]: arr[1:2,0:1]
Out[23]: array([[4]])
In [24]: # 取点
In [25]: arr[[0,2],[3,3]]
Out[25]: array([ 3, 11])
In [26]: # 取点位置相当于对应的(x1,y1)(x2,y2)
注意
In [28]: arr
Out[28]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [29]: arr[0:,]
Out[29]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [30]: arr[[0,2],:]
Out[30]:
array([[ 0, 1, 2, 3],
[ 8, 9, 10, 11]])
In [31]: arr[[0,2],:] = 10
In [32]: arr
Out[32]:
array([[10, 10, 10, 10],
[ 4, 5, 6, 7],
[10, 10, 10, 10]])
In [33]: # 采用直接赋值的方式来进行修改
np.where(condition, [x, y])
该函数为三元表达式x if condition else y
的向量化版本
condition : 为条件
x : 当条件满足的时候执行x
y : 当条件不满足的时候执行y
In [37]: arr1 = np.arange(24).reshape(4,6)
In [38]: arr1
Out[38]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
In [39]: # 将arr1中的数组,将大于10的数组变成20,小于10的数组变成0
In [40]: np.where(arr1>10, 20, 0)
Out[40]:
array([[ 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 20],
[20, 20, 20, 20, 20, 20],
[20, 20, 20, 20, 20, 20]])
In [41]: # 将arr1中的数组,将大于10的数组变成20,小于10的数组变成本身
In [42]: np.where(arr1>10, 20, arr1)
Out[42]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 20],
[20, 20, 20, 20, 20, 20],
[20, 20, 20, 20, 20, 20]])
np.clip((a, a_min, a_max)
a : 为数组
a_min : 最小的值
a_max : 最大的值
In [45]: arr1
Out[45]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
In [46]: # 设置最小值为9,最大值为20
In [47]: np.clip(arr1, 9, 20)
Out[47]:
array([[ 9, 9, 9, 9, 9, 9],
[ 9, 9, 9, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 20, 20, 20]])
In [48]: # 当值小于9会自动变成9,当大于20会变成20
In [49]:
方法 | 描述 |
---|---|
sum | 沿着轴向计算所有元素的累和,0长度的数组,累和为0 |
mean | 数学平均值,0长度的数组平均值为NaN |
max, min | 最大值和最小值 |
argmax, argmin | 最大值和最小值的位置 |
std, var | 标准差和方差 |
ptp | 极值() |
cumsum | 从0开始元素累积和 |
median | 中值 |
In [67]: arr1
Out[67]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
In [68]: # 所有值的和
In [69]: np.sum(arr1)
Out[69]: 276
In [70]: # 平均值
In [71]: np.mean(arr1)
Out[71]: 11.5
In [72]: # 最大值
In [73]: np.max(arr1)
Out[73]: 23
In [74]: # 最小值
In [75]: np.min(arr1)
Out[75]: 0
In [76]: # 最大值的索引位置
In [77]: np.argmax(arr1)
Out[77]: 23
In [78]: # 标准差
In [79]: np.std(arr1)
Out[79]: 6.922186552431729
In [80]: # 方差
In [81]: np.var(arr1)
Out[81]: 47.916666666666664
In [82]: # 极值
In [83]: np.ptp(arr1)
Out[83]: 23
In [84]: # 元素累积
In [85]: np.cumsum(arr1)
Out[85]:
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78,
91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276], dtype=int32)
In [86]: # 中值
In [87]: np.median(arr1)
Out[87]: 11.5
Nan与inf介绍
Nan
: not a number 它表示不是一个数字inf
: inf表示正无穷,-inf表示负无穷注意
In [17]: import numpy as np
In [18]: arr = np.arange(16).reshape(4,4)
In [19]: # np.nan为浮点数,两个nan不相等
In [20]: arr = arr.astype('float')
In [21]: arr
Out[21]:
array([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]])
In [22]: # 将6变成nan,
In [23]: arr[1,2] = np.nan
In [24]: arr
Out[24]:
array([[ 0., 1., 2., 3.],
[ 4., 5., nan, 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]])
In [25]: np.nan == np.nan
Out[25]: False
In [26]: # 两个nan比较是完全不相等的
判断数组中的nan的个数
np.count_nonzero(arr)
np.isnan(arr)
In [31]: arr
Out[31]:
array([[ 0., 1., 2., 3.],
[ 4., 5., nan, 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]])
In [32]: # 计算数组非零的个数
In [33]: np.count_nonzero(arr)
Out[33]: 15
In [34]: # 计算数组中为nan的个数
In [35]: np.isnan(arr)
Out[35]:
array([[False, False, False, False],
[False, False, True, False],
[False, False, False, False],
[False, False, False, False]])
In [36]: # isnan 等价于 arr!= arr
In [37]: arr != arr
Out[37]:
array([[False, False, False, False],
[False, False, True, False],
[False, False, False, False],
[False, False, False, False]])
In [39]: np.count_nonzero(np.isnan(arr))
Out[39]: 1
处理Nan
在Numpy中,为了避免处理后的Nan的值会对整体的数值有比较大的影响,通常我们会将其替换成中值或者均值即可
# @Time : 2020/4/30 10:01
# @Author : SmallJ
import numpy as np
"""
在numpy中,为了避免处理后的nan,一般我们采用替换成中值或者平均值
"""
# 生成数组
arr = np.arange(16).reshape(4, 4).astype('float')
# 生成nan数据
arr[1, 2:] = np.nan
# 处理nan数据,由于该nan为第二行。
# 如果采用行的方式,求出来的平均值或中值就不准确了
# 所以采用列的方式,来求平均值
# 第一步 采用for循环,循环出列数
for i in range(arr.shape[1]):
# 取出每一列
arr_col = arr[:, i]
# 获取每一列的nan的个数
nan_num = np.count_nonzero(np.isnan(arr_col))
# nan为0的时候证明没有没有nan,为1时证明有nan
if nan_num != 0:
# 取出不是nan的数值
# 怎么判断呢,因为两个nan之间是不相等的
not_num = arr_col[arr_col == arr_col]
data = np.mean(not_num)
# 将nan进行赋值
arr_col[arr_col != arr_col] = data
arr = arr.astype('int')
print(arr)
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
参数 | 解释 |
---|---|
frname | 文件、字符串或产生器,可以是.gz或bz2压缩文件 |
dtype | 数据类型,可选,csv的字符串以什么数据类型读入数组中,默认np.float |
delimiter | 分隔字符串,默认是任何空格,改为逗号 |
skiprows | 跳过前x行,一般跳出第一行表头 |
usecols | 读取指定的列,索引,元组类型 |
unpack | 如果True,读入属性将分别写入不同数组变量,Flase读入数据只写入一个数组,默认为False |