1. 多维数组的切片
定义Numpy的一个多维数组
import numpy as np
ArrOne = np.arange(20).reshape(4,5)
# np.arange(20),生成0-19,20长一维向量,通过reshape变成4*5的二维数组
print("ArrOne ->> ", '\n', ArrOne)
print("ArrOne的维度 ->> " , ArrOne.shape)
输出如下:
假如我们要取出红框中的元素
红框中的数据是矩阵ArrOne第2,3行与第2,3,4列包围的数据.,使用两种方法取出数据:
RedBoxArr_1 = ArrOne[1:3, 1: 4]
RedBoxArr_2 = ArrOne[1: 3, :][:, 1: 4] #前一个冒号可以省略,后一个不能
print("RedBoxArr_1 ->> ", '\n', RedBoxArr_1)
print('ArrOne[1: 3]','\n', ArrOne[1: 3])
print("RedBoxArr_2 ->> ", '\n', RedBoxArr_2)
## RedBoxArr_2等价于:
## a = ArrOne[1: 3]
## RedboxArr_2 = a[1: 4]
输出如下
可以看到用这两种方法都可以实现多维数组的切片。
2. 注意事项
要注意:从多维数组中取出某一列,造成的维度变化
如要取出ArrOne第2行的元素,代码阐述:
GreeBoxArr_1 = ArrOne[1]
GreeBoxArr_2 = ArrOne[1:2]
# 我们看看有什么区别
print('GreeBoxArr_1', '\n', GreeBoxArr_1, '\n')
print('GreeBoxArr_2','\n', GreeBoxArr_2, '\n')
print('GreeBoxArr_1\'s shape', '\n', GreeBoxArr_1.shape, '\n')
print('GreeBoxArr_2','\n', GreeBoxArr_2.shape, '\n')
输出结果如下:
我们看到这两种方式都取出了ArrOne第2行的元素。但是用第一种取出的只有一个维度。而用第二种方法取出的有两个维度。在进行矩阵运算时一定要注意这两者取值的差异。
结论:Arr[1:2],Arr[:, 1:2]等方式切片能够保持矩阵维度在2维(取决Arr本身的维度),而用Arr[1], Arr[:, 1]方式切片不能够维持原本的矩阵维度。
计算demo:
ArrTwo = np.arange(5).reshape(5, 1)
ArrThree = np.arange(5).reshape(1, 5)
ResultOfGreeBox1_1 = np.matmul(ArrTwo, GreeBoxArr_1)
ResultOfGreeBox1_2 = np.matmul(ArrThree, GreeBoxArr_1)
ResultOfGreeBox2_1 = np.matmul(ArrTwo, GreeBoxArr_2)
ResultOfGreeBox2_2 = np.matmul(ArrThree, GreeBoxArr_2)
print('ResultOfGreeBox1_1', '\n', ResultOfGreeBox1_1, '\n')
print('ResultOfGreeBox1_2','\n', ResultOfGreeBox1_2, '\n')
print('ResultOfGreeBox2_1', '\n', ResultOfGreeBox2_1, '\n')
print('ResultOfGreeBox2_2','\n', ResultOfGreeBox2_2, '\n')
可以看到ResultOfGreeBox1_1出现了维度异常错误