一、数组或矩阵中替换大于或小于等于某个值的元素
最快和最简洁的方法是使用Numpy的内置索引。
import numpy as np
a = np.array([[1,2,3],
[1,2,3],
[1,2,3]])
a[a > 2] = 0
print(a)
结果:
[[1 2 0]
[1 2 0]
[1 2 0]]
以上实现的原理是a > 2返回的是矩阵大小的bool类型,如下
a > 2
Out[20]:
array([[False, False, True],
[False, False, True],
[False, False, True]])
二、把二维数组(矩阵)中行或列的值相加
1)、全部相加
import numpy as np
a = np.array([[1,2,3],
[1,2,3],
[1,2,3]])
print(a.sum())
结果
18
2)、行或列相加
print("行相加:")
print(a.sum(axis=1))
print("列相加:")
print(a.sum(axis=0))
结果
行相加:
[6 6 6]
列相加:
[3 6 9]
3)、指定行或列相加
print("倒数第一行相加:")
print(a[-1].sum())
print("倒数第一列相加:")
print(a[:, -1].sum())
结果
倒数第一行相加:
6
倒数第一列相加:
9
三、numpy生成序列
1、一定范围固定间隔数据
如下是生成从[10, 30)的间隔为5的序列
np.arange(10, 30, 5)
Out[2]: array([10, 15, 20, 25])
2、随机序列
如下为2行3列的0-1之间的随机数据,参数(2, 3)指定大小
np.random.rand(2, 3)
Out[3]:
array([[0.69260095, 0.91129963, 0.29301557],
[0.38907886, 0.53542189, 0.99137202]])
如下生成整形随机数,前两个参数指定范围,后一个参数指定大小(可以是单个数、一维矩阵、二维矩阵)
np.random.randint(0,10,(2,3))
Out[4]:
array([[1, 1, 3],
[5, 3, 4]])
np.random.randint(0,10)
Out[5]: 9
np.random.randint(0, 10, 5)
Out[6]: array([4, 8, 5, 5, 4])
如下功能和上面类似,二项分布函数,np.random.binomial(n,p,size=N),函数的返回值表示n中成功的次数
np.random.binomial(5, 0.5, size=(2,3))
Out[7]:
array([[3, 3, 3],
[4, 2, 5]])
如下为生成从0(参数1)开始,间隔为2*pi(参数2),的10个数(参数3),一般在函数自变量用的多
np.linspace(0, 2*np.pi, 10)
Out[18]:
array([0. , 0.6981317 , 1.3962634 , 2.0943951 , 2.7925268 ,
3.4906585 , 4.1887902 , 4.88692191, 5.58505361, 6.28318531])
四、numpy数据处理
1、向下取整
就是去掉小数点后的
a
Out[22]:
array([[9.23575386, 8.97291699, 0.91386481],
[3.51247694, 6.29633935, 1.5733286 ]])
np.floor(a)
Out[23]:
array([[9., 8., 0.],
[3., 6., 1.]])
2、重新定义数组大小reshape成矩阵,把矩阵拉直成向量ravel
b
Out[25]: array([9, 4, 5, 8, 4, 9])
b.reshape(2, 3)
Out[26]:
array([[9, 4, 5],
[8, 4, 9]])
b.reshape(2, 3).ravel()
Out[27]: array([9, 4, 5, 8, 4, 9])
3、矩阵拼接操作
b
Out[34]:
array([[9., 4., 5.],
[8., 4., 9.]])
a
Out[35]:
array([[9., 8., 0.],
[3., 6., 1.]])
#横向拼接
np.hstack((a, b))
Out[37]:
array([[9., 8., 0., 9., 4., 5.],
[3., 6., 1., 8., 4., 9.]])
#纵向拼接
np.vstack((a, b))
Out[38]:
array([[9., 8., 0.],
[3., 6., 1.],
[9., 4., 5.],
[8., 4., 9.]])
4、矩阵拆分,和上面相反
np.hsplit()水平方向竖着切,np.vsplit()竖直方向水平切
a
Out[3]:
array([[2., 5., 9., 6., 9., 4., 3., 8., 1., 2., 5., 8.],
[1., 5., 7., 3., 0., 8., 6., 3., 3., 2., 2., 6.]])
#切分成3份
np.hsplit(a, 3)
Out[5]:
[array([[2., 5., 9., 6.],
[1., 5., 7., 3.]]),
array([[9., 4., 3., 8.],
[0., 8., 6., 3.]]),
array([[1., 2., 5., 8.],
[3., 2., 2., 6.]])]
#传入一个元组(3, 4),表示在第3和4处切分
np.hsplit(a, (3, 4))
Out[4]:
[array([[2., 5., 9.],
[1., 5., 7.]]),
array([[6.],
[3.]]),
array([[9., 4., 3., 8., 1., 2., 5., 8.],
[0., 8., 6., 3., 3., 2., 2., 6.]])]
5、数据复制
直接b = a赋值,b和a指向的同一个地址的数据,修改b,a也会变;c = a.view()浅复制不会指向一个地址,但修改c时a也会改;d = a.copy()这样这俩变量就没有任何关系的复制了。
6、找数据中最值的索引
数据a为上面4的,以下分别为求二维一维最值索引
#最大索引
a.argmax(axis=0)
Out[11]: array([0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0], dtype=int64)
a.argmax(axis=1)
Out[12]: array([2, 5], dtype=int64)
#最小索引
a.argmin(axis=0)
Out[15]: array([1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1], dtype=int64)
a.argmin(axis=1)
Out[16]: array([8, 4], dtype=int64)
a[1].argmin()
Out[17]: 4
五、numpy数据扩展
如下为扩展到2行倍,3列倍
b
Out[22]: array([5, 7, 9])
np.tile(b, (2, 3))
Out[23]:
array([[5, 7, 9, 5, 7, 9, 5, 7, 9],
[5, 7, 9, 5, 7, 9, 5, 7, 9]])
六、numpy与其他数据类型转化
1、numpy与list互转
ndarray 转 list
In [2]: a = np.array([1, 2, 3])
In [3]: a.tolist()
Out[3]: [1, 2, 3]
七、numpy常用数学和统计运算函数
函数 | 函数说明 |
---|---|
np.pi | 常数 π \pi π |
np.e | 常数 e e e |
np.fabs(arr) | 计算各元素的浮点型绝对值 |
np.ceil(arr) | 对各元素向上取整 |
np.floor(arr) | 对各元素向下取整 |
np.round(arr) | 对各元素四舍五入 |