ndarray高维数组的索引和切片

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],分别在三个不同的索引值列表中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。