目录
1. numpy创建数组
#测试numpy中的数组
import numpy as np #导入 numpy
import random
a = np.array([1,2,3,4,5])
b = np.array(range(1,5))
c = np.arange(1,6,dtype=float)
print(a)
print(b)
print(c)
c = c.astype(int)
d = np.array([random.random() for i in range(10)])
print(d)
print(np.round(d,2)) #保留两位小数
'''
输出结果:
[1 2 3 4 5]
[1 2 3 4]
[1. 2. 3. 4. 5.]
[0.83478331 0.57183625 0.64594309 0.77648844 0.94178162 0.41432769
0.12386185 0.87640671 0.69635833 0.78718436]
[0.83 0.57 0.65 0.78 0.94 0.41 0.12 0.88 0.7 0.79]
'''
2. numpy 数组的形状
1)a.shape 返回一个元组。
2)reshape():是一个有返回值的操作,不会对源数据进行修改。参数原则上是一个元组,但只输入行、列数值也可行。
#测试数组的形状
import numpy as np
a = np.arange(24).reshape((2,3,4))
print(a.shape)
a1 = a.reshape(1,24) #不是一维数组
print(a1)
#将多维数组转化为一维数组
num = 1
for i in range(len(a.shape)):
num *= a.shape[i]
a2 = a.reshape(num,)
print(a2)
a3 = a.flatten()
print(a3)
'''
输出结果:
(2, 3, 4)
[[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]]
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
'''
3. 数组的计算
3.1 数组与数字的计算
【广播机制】在运算过程中,与数字的加减乘除被广播到数组所有元素上面。例如:
3.2 数组和数组的计算
#测试数组的计算
import numpy as np
a = np.arange(24).reshape((4,6)) #4行6列的数组
b = np.arange(100,124).reshape(4,6) #4行6列的数组
c = np.arange(6) #1行6列的数组
d = np.arange(4).reshape(4,1) #4行1列的数组
print(a+b) #两数组形状一致,对应位置的元素进行加减计算
print(a-c) #a数组每行元素与c数组对应位置的元素可加减
print(a-d) #a数组每列元素与d数组对应位置的元素可加减
'''
输出结果:
[[100 102 104 106 108 110]
[112 114 116 118 120 122]
[124 126 128 130 132 134]
[136 138 140 142 144 146]]
[[ 0 0 0 0 0 0]
[ 6 6 6 6 6 6]
[12 12 12 12 12 12]
[18 18 18 18 18 18]]
[[ 0 1 2 3 4 5]
[ 5 6 7 8 9 10]
[10 11 12 13 14 15]
[15 16 17 18 19 20]]
'''
3.3 轴
在numpy中可以理解为方向,使用0,1,2...数字表示。对于一个一维数组,只有一个0轴;对于2维数组(shape(2,2)),有0轴和1轴;对于三维数组(shape(2,2, 3)),有0,1,2轴。
4. numpy读取数据
4.1 读取 csv 文件
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False
#测试numpy读取数据
import numpy as np
us_file_path = "./us_video_data_numbers.csv"
gb_file_path = "./gb_video_data_numbers.csv"
#unpack:转置
t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int")
t2 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
4.2 numpy中的转置
#测试numpy转置操作
import numpy as np
t = np.arange(24).reshape((4,6))
t1 = t.transpose()
t2 = t.T
t3 = t.swapaxes(1,0) #交换轴
5. 数组的索引和切片
#测试numpy 的切片和索引
import numpy as np
#取单独的某行
print(t1[2])
#取连续的多行
print(t1[1:4]) #第2行至第4行
print(t1[2:]) #从第3行开始的每一行
#取不连续的多行
print(t1[[2,7,10]]) #第3、8、11行
#逗号前表示行,逗号后表示列;冒号表示全部都要
print(t1[1,:]) #第2行
print(t1[1:,:]) #从第2行开始的每一行
print(t1[[2,10,3],:]) #第3、11、4行
#取某列
print(t1[:,0]) #第1列
#取连续的多列
print(t1[:,1:]) #从第2列开始的每列
#取不连续的多列
print(t1[:,[0,2]]) #第1列和第3列
#取某行某列
a = t1[2,3] #第3行、第4列
print(type(a)) #<class 'numpy.int32'>
#取多行多列
b = t1[2:5,1:4] #第3-5行、2-4列
print(b)
#取多个不相邻的点
c = t1[[0,2,2],[0,1,3]] #坐标[0,0]、[2,1]、[2,3]的点
6. numpy中数值的修改
#测试numpy中数值的修改
import numpy as np
t = np.arange(24).reshape((4,6))
print(t)
print("*"*100)
t[:,2:4] = 0 #第3、4列元素全部替换为0
print(t<10) #布尔索引
t[t<10] = 3 #将t中小于10的数字替换为3
#numpy的三元运算符
t1 = np.where(t<10,0,10) #将t中小于10的数字替换为0,大于等于10的替换为10
print(t1)
t2 = t.clip(10,20) #将t中小于10的数字替换为10,大于20的替换为20
print(t2)
7. numpy中的 nan
1)nan(NAN,Nan):not a number表示不是一个数字
2)nan 的 type类型为 float
#测试numpy中的nan
import numpy as np
print(np.nan == np.nan) #结果为 False
t = np.arange(24,dtype=float).reshape((4,6))
t[2,4:] = np.nan
print(t)
print("*"*100)
print(t!=t)
print(np.isnan(t))
print(np.count_nonzero(t!=t))
print(np.count_nonzero(np.isnan(t)))
print("*"*100)
t[np.isnan(t)] = 0
#np.sum()
t1 = np.arange(12).reshape((3,4))
a = np.sum(t1)
b = np.sum(t1,axis=0) #每行对应位置相加
c = np.sum(t1,axis=1) #每列对应位置相加
print("*"*100)
#nan和任何值计算都为nan
print(np.sum(t,axis=0))
'''
输出结果:
[[ 0. 1. 2. 3. 4. 5.]
[ 6. 7. 8. 9. 10. 11.]
[12. 13. 14. 15. nan nan]
[18. 19. 20. 21. 22. 23.]]
****************************************************************************************************
[[False False False False False False]
[False False False False False False]
[False False False False True True]
[False False False False False False]]
[[False False False False False False]
[False False False False False False]
[False False False False True True]
[False False False False False False]]
2
2
****************************************************************************************************
[[ 0. 1. 2. 3. 4. 5.]
[ 6. 7. 8. 9. 10. 11.]
[12. 13. 14. 15. 0. 0.]
[18. 19. 20. 21. 22. 23.]]
****************************************************************************************************
[36. 40. 44. 48. 36. 39.]
'''
8. numpy 中常用统计函数
求和:t.sum(axis=None)
均值:t.mean(a,axis=None)
中值:np.median(t,axis=None)
最大值:t.max(axis=None)
最小值:t.min(axis=None)
极值:np.ptp(t,axis=None) ,即最大值和最小值之差
标准差:t.std(axis=None)
#用均值填充nan
import numpy as np
def fill_ndarray(t):
for i in range(t.shape[1]): #遍历每一列
col = t[:,i] #当前的一列
nan_num = np.count_nonzero(col!=col)
if nan_num != 0: #当前列中有nan
not_nan_col = col[col==col] #当前一列不为nan的数组
col[np.isnan(col)] = not_nan_col.mean() #选中当前为nan的位置,替换为非nan数值的均值
return t
if __name__ == '__main__':
t = np.arange(24,dtype=float).reshape((4,6))
t[2,4:] = np.nan
print(t)
t = fill_ndarray(t)
print(t)
'''
输出结果:
[[ 0. 1. 2. 3. 4. 5.]
[ 6. 7. 8. 9. 10. 11.]
[12. 13. 14. 15. nan nan]
[18. 19. 20. 21. 22. 23.]]
[[ 0. 1. 2. 3. 4. 5.]
[ 6. 7. 8. 9. 10. 11.]
[12. 13. 14. 15. 12. 13.]
[18. 19. 20. 21. 22. 23.]]
'''
9. 数组的拼接
#数组的拼接
import numpy as np
t1 = np.arange(12).reshape((2,6))
t2 = np.arange(12,24).reshape((2,6))
#竖直拼接
t3 = np.vstack((t1,t2))
print(t3)
#水平拼接
t4 = np.hstack((t1,t2))
print(t4)
'''
输出结果:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 0 1 2 3 4 5 12 13 14 15 16 17]
[ 6 7 8 9 10 11 18 19 20 21 22 23]]
'''
10. 数组的行列交换
#数组的行列交换
import numpy as np
t = np.arange(12,24).reshape(3,4)
print(t)
print("*"*100)
#第2、3行交换
t[[1,2],:] = t[[2,1],:]
print(t)
print("*"*100)
#第1、3列交换
t[:,[0,2]] = t[:,[2,0]]
print(t)
'''
输出结果:
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
****************************************************************************************************
[[12 13 14 15]
[20 21 22 23]
[16 17 18 19]]
****************************************************************************************************
[[14 13 12 15]
[22 21 20 23]
[18 17 16 19]]
'''