ndarray高维数组的索引和切片
假设有一个数组不是一维的,而是多维的,那么又该如何进行切片呢?首先先导入numpy模块,生成一个多维数组
import numpy
arr2 = np.random.randint(0,20,(3,3))
arr2
array([[ 2, 17, 11],
[ 4, 15, 14],
[10, 18, 6]])
这里生成了一个三行三列的二维数组,用一维数组的方法进行元素的读取
arr2[1]
array([ 4, 15, 14])
发现结果是一个一维数组,而且这个一维数组正是二维数组的第二行,那再加一个索引值会发现什么呢?
arr2[1,1]
15
发现结果是一个数值,这个数值正是数组[ 4, 15, 14]中的第二个元素,到这里我们发现了什么呢?我们发现多维数组其实就是多个数组的嵌套啊,有没有?比如上面的二维数组可以这样展开[[ 2, 17, 11],[ 4, 15, 14],[10, 18, 6]],很明显,蓝色框表示一个数组,这个数组的元素是以红色为框的数组。这样读取数组的时候,就可以一层一层剥洋葱一样,从外层数组剥起,以元素15为例,15是在蓝色框里的第二个数组中,所以首先剥开最外层的蓝色框,arr2[1],这里要注意,数组下标都是从0开始的,也就是说第二个数组的下标是1不是2.剥完就得到了红色框的数组[4,15,14],继续往下剥,15在这个数组的第二个位置,所以arr2[1][1]就得到15啦。下面以一个三维数组来进一步证明这个结论。
arr3 = np.random.randint(0,20,(3,3,3))
arr3#得到一个三维数组
array([[[ 8, 15, 5],
[12, 15, 0],
[14, 17, 16]],
[[ 9, 16, 17],
[ 2,16, 5],
[16, 6, 12]],
[[18, 13, 1],
[13, 2, 19],
[ 7, 1, 4]]])
假设我们要得到红色的16
arr3[1]#首先剥开第一层,得到三维数组中的第二个数组
array([[ 9, 16, 17],
[ 2, 16, 5],
[16, 6, 12]])
可以看出这是个三行三列的二维数组,继续
arr3[1,1]#得到一个一维数组
array([ 2, 16, 5])
arr3[1,1,1]
16
最后得到我们想要的结果16,所以我们的猜想是正确的呀,有没有。
最后,我们再提出一个问题,假如我们最后需要的不仅仅是一个数值,而是一个数组切片,而且这个切片不是连续的,而是特定的值,那该怎么办呢?我们以新生成的一个数组为例:
import numpy
arr1 = np.random.randint(2,20,10)
arr1
array([ 7,16,3, 3,13,15, 4, 8, 16, 14])
假如我们要得到标红的数值组成的一个数组切片,那么靠以上的一层一层剥肯定不行了,那该怎么办呢?诶,这是个一维数组,所以只需要剥一层就能得到所需要的元素,但这样只能得到一个数值啊,要得到多个数值咋办?加个列表啊
arr1[[1,2,4,5]]
array([16, 3, 13, 15])
这样,把原来的一个索引值变成一个索引列表,把所需要的所有元素的索引都加进去,这样不就可以了嘛。
那假如是多维的呢?以二维数组为例。
arr2 = np.random.randint(2,20,(3,3))arr2
array([[8, 19, 11],
[ 6, 4,9],
[ 4,15, 11]])
我们来切8,9,15
arr2[[0,0,2],[0,1,1]]
array([ 8, 19, 15])
可以看出,二维数组需要两个索引列表,第一个索引列表表示的是二维数组中该数值所在的一维数组的索引,即位置,第二个索引列表表示的是该数值所在的一维数组的索引。以数值8为例,将二维数组展开来写[[8, 19, 11],[ 6, 4, 9],[ 4, 15, 11]],8的位置在二维数组中的第1个数组里面,所以它的第一个索引值为0,剥开进到这个第1个数组[8, 19, 11],8又在这个数组的第一个位置,故其索引值为0。其它值类推
再来举一个三维数组为例
arr3 = np.random.randint(2,20,(2,3,3))
arr3
array([[[12, 5, 9],
[12, 8, 5],
[10, 18,19]],
[[18, 18, 9],
[17,15, 3],
[17, 10,6]]])
#切取19,6,15
arr3[[0,1,1],[2,2,1],[2,2,1]]
array([19, 6, 15])
结果非常amazing,跟我们所想的一样。以19为例,将三维数组展开,[[[12, 5, 9],[12, 8, 5],[10, 18, 19]], [[18, 18, 9],[17, 15, 3], [17, 10, 6]]]。19的位置在三维数组中的第一个二维数组中,其索引为0,[[12, 5, 9],[12, 8, 5],[10, 18, 19]],然后又在这个二维数组中的第三个一维数组中,其索引值为2,[10, 18,19],最后,19又在这个一维数组中的第三个位置,其索引值为2。所以19总的索引值为[2,2,2],分别在三个不同的索引值列表中。