接上一篇博客,接下来介绍一下数组的操作
二、数组基本操作
创建数组:
1、直接创建np.array
a = np.array([[1,2,3],[4,5,6]])
2、将现有的数据类型转换成数组 np.asarray
x = [1,2,3]
a = np.asarray(x)
切片、索引
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print (a[2,1]) #第三行第二列的数5
print (a[…,1]) #取每行第二列的数[2 4 5]
print (a[1,…]) #取每列第二行的数[3 4 5]
print (a[…,1:]) #第2列及剩下的所有元素
print(a[1:3,[1,2]]) #[[4 5] [5 6]]
通过布尔索引来找数组
x = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print (x[x >5])
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式。
符合以下任意一条规则便可计算:
数组拥有相同形状。
当前维度的值相等。
当前维度的值有一个是 1。
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
c = a + b #array([11, 22, 33, 44])
a = np.array([[ 0, 0, 0],[10,10,10],[20,20,20],[30,30,30]])
b = np.array([1,2,3])
print(a + b) #[[ 1 2 3],[11 12 13],[21 22 23],[31 32 33]]
a = np.arange(0,60,5)
a = a.reshape(3,4)
b=a.T #a的转置
for x in np.nditer(a, order = ‘C’): 将a的元素按行优先输出
print (x, end=", “)
#0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55
for x in np.nditer(a, order = ‘F’): 将a的元素按列优先输出
print (x, end=”, " )
#0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55
三、数组操作
1、修改数组形状
reshape 不改变数据的条件下修改形状
flat 数组元素迭代器
flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
ravel 返回展开数组,修改会改变原始数组
a = np.arange(8)
b = a.reshape(4,2) #变成4行2列
for x in b.flat: #输出每个元素
print (x)
flatten与ravel都是把数组降成1维数据,flatten的修改不影响原始数组,ravel的修改影响原始数组
b.flatten()[1]=100 #array([[0, 1],[2, 3],[4, 5],[6, 7]])
b.ravel()[1]=100 #array([[0, 100],[2, 3],[4, 5],[6, 7]])
2、翻转数组
ndarray.T 转置
a = np.arange(0,60,5).reshape(3,4)
b=a.T #转置
3、连接数组
concatenate 连接沿现有轴的数组序列
stack 沿着新的轴加入一系列数组。
hstack 水平堆叠序列中的数组(列方向)
vstack 竖直堆叠序列中的数组(行方向)
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print (np.concatenate((a,b),axis = 0))
[[1 2],[3 4],[5 6],[7 8]]
print (np.concatenate((a,b),axis = 1))
[[1 2 5 6],[3 4 7 8]]
print (np.stack((a,b),0))
[[[1 2],[3 4]],[[5 6],[7 8]]]
print (np.stack((a,b),1))
[[[1 2],[5 6]],[[3 4],[7 8]]]
c = np.hstack((a,b)) #水平堆叠
[[1 2 5 6],[3 4 7 8]]
d = np.vstack((a,b)) #垂直堆叠
[[1 2],[3 4],[5 6],[7 8]]
4、分割数组(生成列表)
split 将一个数组分割为多个子数组
hsplit(等分) 将一个数组水平分割为多个子数组(按列)
vsplit(等分) 将一个数组垂直分割为多个子数组(按行)
a = np.arange(9)
b = np.split(a,3) #平均分为三组 生成列表
c = np.split(a,[4,7]) #可按索引进行分组,生成列表
[array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]
a = np.arange(16).reshape(4,4)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
b = np.vsplit(a,2)
[array([[0, 1, 2, 3],[4, 5, 6, 7]]),
array([[ 8, 9, 10, 11],[12, 13, 14, 15]])]
c = np.hsplit(a,2)
[array([[ 0, 1],[ 4, 5],[ 8, 9],[12, 13]]),
array([[ 2, 3],[ 6, 7],[10, 11],[14, 15]])]
5、数组元素的添加与删除
resize 返回指定形状的新数组
append 将值添加到数组末尾
insert 沿指定轴将值插入到指定下标之前
delete 删掉某个轴的子数组,并返回删除后的新数组
unique 查找数组内的唯一元素
a = np.array([[1,2,3],[4,5,6]])
b = np.resize(a, (3,2))
print (np.append(a, [7,8,9]))
[1 2 3 4 5 6 7 8 9]#axis无定义时,是横向加成,返回总是为一维数组
print (np.append(a, [[7,8,9]],axis = 0))
[[1 2 3]
[4 5 6]
[7 8 9]]
print (np.append(a, [[5,5,5],[7,8,9]],axis = 1))
[[1 2 3 5 5 5]
[4 5 6 7 8 9]]
a = np.array([[1,2],[3,4],[5,6]])
print (np.insert(a,3,[11,12]))
#[ 1 2 3 11 12 4 5 6]
print (np.insert(a,1,[11],axis = 0))
[[ 1 2]
[11 11]
[ 3 4]
[ 5 6]]
print (np.insert(a,1,11,axis = 1))
[[ 1 11 2]
[ 3 11 4]
[ 5 11 6]]
a = np.arange(12).reshape(3,4)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
print (np.delete(a,5))
[ 0 1 2 3 4 6 7 8 9 10 11]
print (np.delete(a,1,axis = 1))
[[ 0 2 3]
[ 4 6 7]
[ 8 10 11]]
print (np.delete(a,1,axis = 0))
[[ 0 1 2 3]
[ 8 9 10 11]]
a = np.array([5,2,6,2,7,5,6,8,2,9])
u = np.unique(a)
[2 5 6 7 8 9]
u,indices = np.unique(a,return_counts = True)
print (u)
print (indices)
[2 5 6 7 8 9]
[3 2 2 1 1 1]
四、统计函数
最大最小值
a = np.array([[3,7,5],[8,4,3],[2,4,9]])
print (np.min(a,axis=1)) #对行操作[3 3 2]
print (np.min(a,axis=0)) #对列操作[2 4 3]
print (np.max(a,axis =0)) #[8 7 9]
print (np.max(a,axis =1)) #[7 8 9]
print (np.max(a)) #9
print (np.min(a)) #2
极差
print (np.ptp(a,axis=1)) #[4 5 7]
print (np.ptp(a,axis=0)) #[6 3 6]
print (np.ptp(a)) #7
百分位数
a = np.array([[10, 7, 4], [3, 2, 1]])
print (np.percentile(a, 50)) #3.5 3和4的平均数
print (np.percentile(a, 50, axis=0)) # [ 6.5 4.5 2.5]
print (np.percentile(a, 50, axis=1)) # [ 7. 2.]
print (np.percentile(a, 50, axis=1, keepdims=True))
#[[ 7.]
[ 2.]]
中位数
a = np.array([[30,65,70],[80,95,10],[50,90,60]])
print (np.median(a)) #65
print (np.median(a,axis=0)) #[ 50. 90. 60.]
print (np.median(a, axis=1)) #[ 65. 80. 60.]
平均数
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print (np.mean(a)) #3.67
print (np.mean(a, axis = 0)) #[ 2.67 3.67 4.67]
print (np.mean(a, axis = 1)) #[ 2. 4. 5.]
加权平均数
a = np.array([1,2,3,4])
print (np.average(a)) #2.5
wts = np.array([4,3,2,1])
print (np.average(a,weights = wts))
#2 (权重加总为10,对应元素权重为[0.4,0.3,0.2,0.1]
10.4+20.3+30.2+40.1=2)
标准差、方差
a = np.array([1,2,3,4])
print (np.std(a))
print (np.var(a))
五、排序、筛选
a = np.array([[3,7],[9,1]])
print(np.sort(a))
#[[3 7]
[1 9]]
print (np.sort(a, axis = 0))
[[3 1]
[9 7]]
对多个列进行排序
nm = (‘raju’,‘anil’,‘ravi’,‘amar’)
dv = (‘f.y.’, ‘s.y.’, ‘s.y.’, ‘f.y.’)
ind = np.lexsort((dv,nm)) #先按nm排,再按dv排
print ([nm[i] + ", " + dv[i] for i in ind])
分区排序
a = np.array([3, 4, 2, 1])
np.partition(a, 3) #比3小的放在前面,大的放在后面
array([2, 1, 3, 4])
np.partition(a, (1, 3)) # 小于 1 的在前面,大于 3 的在后面,1和3之间的在中间array([1, 2, 3, 4])
arr = np.array([46, 57, 23, 39, 1, 10, 0, 120])
arr[np.argpartition(arr, 2)[2]] #输出第三小的值 10
arr[np.argpartition(arr, -2)[-2]] #输出第二大的值 57
x = np.arange(9).reshape(3,3)
y = np.where(x>3)
print (x[y]) 找出大于3的值
六、线性代数运算
dot 两个数组的点积,即元素对应相乘。
vdot 两个向量的点积
inner 两个数组的内积
matmul 两个数组的矩阵乘积
determinant 数组的行列式
solve 求解线性矩阵方程
inv 计算矩阵的乘法逆矩阵
a = np.array([[1,2],[3,4]])
b = np.array([[11,12],[13,14]])
print(np.dot(a,b))
#[[111+213, 112+214],[311+413, 312+414]]
=[[37 40],[85 92]]
a = np.array([[1,2],[3,4]])
b = np.array([[11,12],[13,14]])
print (np.vdot(a,b)) #111 + 212 + 313 + 414 = 130
a = [[1,0],[0,1]]
b = [[4,1],[2,2]]
print (np.matmul(a,b))
#[[4 1]
[2 2]]
a = np.array([[1,2], [3,4]])
print (np.linalg.det(a)) #行列式-2
ainv = np.linalg.inv(a) #求a的逆矩阵
求解方程组
x + y + z = 6
2y + 5z = -4
2x + 5y - z = 27
a = np.array([[1,1,1],[0,2,5],[2,5,-1]])
b = np.array([[6],[-4],[27]])
x = np.linalg.solve(a,b)
结果得:array([[ 5.],[ 3.],[-2.]])