numpy常用操作
1、 unique: 去重
(1)一维数组去重:直接将一维数组中的元素进行去重
arr = np.array([2,3,4,3,2,2,3,4,2,2,3,4])
[2 3 4 3 2 2 3 4 2 2 3 4]
print(np.unique(arr))
[2 3 4]
(2)二维数组去重:
- 默认,unique(arr),axis = None,会将所有的元素先转化为一维数组,再进行去重
- axis = 0/1, 整行或者整列进行排序,将行(列)中重复的元素去重,返回每行(列)去重后的数组
- 横向:将每行中元素重复的剔除
- 纵向:将每列中元素全部相同的剔除
arr1 = np.array([[1,1,1,1], [1,1,1,1],[1,1,1,1],[1,1,1,1]])
print(arr1)
print('--------------------------')
print(np.unique(arr1, axis=0))
print(np.unique(arr1, axis=1))
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
--------------------------
[[1 1 1 1]]
[[1]
[1]
[1]
[1]]
2、 文件操作
1. 二进制文件
.npy .npz,必须通过numpy来操作的文件
(1)load :读取二进制文件
.npy文件 # 直接进行读取
# b 读取二进制文件
print(np.load('arr.npy'))
[0.04397625 0.94789624 0.46150546 ... 0.85790328 0.39237683 0.77939274] # 直接进行读取
.npz文件 # 直接读取的是对象,需要进行list查看所有文件,再进行指定读取的文件
# list 查看file下的npy文件, arr_0.npy, arr_1.npy
data = np.load('arrz.npz', allow_pickle=True)
print(data) # <numpy.lib.npyio.NpzFile object at 0x000000000BE38DC8>
print(list(data)) # ['arr_0', 'arr_1', 'arr_2']
print(data['arr_2'])
[[6.15907619e-01 5.93048582e-01 8.36780430e-01 9.80096328e-01
9.22749156e-01 1.17418170e-01 2.85189358e-01 4.39288358e-01
7.16461630e-01 9.84378165e-01 7.32501462e-01 7.44045292e-01
8.02260122e-01 2.26461822e-01 5.66273204e-01 3.80147492e-01
7.07930411e-01 2.36272831e-01 7.37709192e-01 3.69642573e-01]]
(2)save:将程序中的文件保存成二进制格式,只能保存一个数组
arr = np.array([2,3,4,3,2,2,3,4,2,2,3,4])
np.save('arr', arr2) # 保存
# b 读取二进制文件
print(np.load('arr.npy'))
(3)savez:将程序中的文件保存成二进制格式,可以保存多个数组
arr1 = np.array([2,3,4,3,2,2,3,4,2,2,3,4])
arr2 = np.array([2,3,4,3,2,2,3,4,2,2,3,4])
arr3 = np.array([2,3,4,3,2,2,3,4,2,2,3,4])
np.savez('arrz', arr1, arr2, arr3) # 保存多个数组
2. 文本文件
(1)savetext:保存为文本文件,fmt:保存的类型,delimiter:分割符
# 默认存储的数据为float类型
arr1 = np.array([2,3,4,3,2,2,3,4,2,2,3,4])
np.savetxt('arrtext',arr1,fmt='%d', delimiter=' ')
(2)loadtext:读取文本文件
# delimiter 使用什么进行分割读取, dtype读取的类型
arr4 = np.loadtxt('arrtext', delimiter=' ', dtype=int)
print(np.loadtxt('arrtext', delimiter=':', dtype=str)) # 使用错误的读取方式,会将数据已一维数组的方式全部读取
print(arr4.dtype)
['1 1 1 1' '1 1 1 1' '1 1 1 1' '1 1 1 1']
int32
3、统计分布方法
(1) 最小值、最大值
print(arr1)
[[ 2 1 3 5]
[ 1 2 12 32]
[11 3 6 2]
[11 6 2 13]]
# 最小值 min
print('=================================')
print(arr1.min())
print(arr1.min(axis=1)) # axis=1 获取行的最小值
print('=============')
print(arr1.min(axis=0)) # axis=0 获取列的最小值
=================================
1
[1 1 2 2]
=============
[1 1 2 2]
# 最大值 max
print(arr1.max())
print(arr1.max(axis=0)) # axis=0 获取列的最大值
32
[11 6 12 32]
(2) 最大值索引 最小值索引
首先将数组进行一维排列, 拿出最大(小)数的索引,从0开始
print(arr1.argmax()) # argmax() 11
print(arr1.argmin()) # argmin() 0
# axis=1/0, 依次求出每一行(列)中的最大(小)的值的索引位置,不进行平铺
print(arr1.argmax(axis=1))
7
1
[3 3 0 3]
(3)标准差 方差
标准差和方差,可以反映数据的分布:
当标准差于方差越大,表示数据越分散
当标准差于方差越小,数据越集中
- std : 标准差
print('标准差:\n', arr1.std(axis=1))
- var: 方差
print('方差差:\n', arr1.var(axis=1))
(4)求和 平均值
print(arr1.sum()) # 全部求和
print(arr1.sum(axis=1)) # 按行求和
print(arr1.sum(axis=0)) # 按列求和
112
[11 47 22 32]
[25 12 23 52]
# 平均值
print(arr1.mean())
print(arr1.mean(axis=1)) # 按行求平均值
print(arr1.mean(axis=0)) # 按列求平均
7.0
[ 2.75 11.75 5.5 8. ]
[ 6.25 3. 5.75 13. ]
(5)累计求和
# 累计求和
print(arr1.cumsum())
print(arr1.cumsum(axis=1))
[ 2 3 6 11 12 14 26 58 69 72 78 80 91 97 99 112]
[[ 2 3 6 11]
[ 1 3 15 47]
[11 14 20 22]
[11 17 19 32]]
(6)累计求积
# 累计求积
print(arr1.cumprod())
print(arr1.cumprod(axis=1))
[ 2 2 6 30 30 60
720 23040 253440 760320 4561920 9123840
100362240 602173440 1204346880 -1523359744]
[[ 2 2 6 30]
[ 1 2 24 768]
[ 11 33 198 396]
[ 11 66 132 1716]]