用低暗的索引数组索引numpy数组会产生比两者都高的暗的数组

时间:2019-07-09 07:53:40

标签: python arrays numpy

a = np.zeros((5,4,3))
v = np.ones((5, 4), dtype=int)
data = a[v]
shp = data.shape

此代码为shp==(5,4,4,3)

我不明白为什么。如何输出更大的数组?对我来说毫无意义,并且很想解释。

3 个答案:

答案 0 :(得分:6)

这被称为advanced indexing。高级索引使您可以基于N维索引在输入数组中选择任意元素。

让我们使用另一个示例使其更清楚:

a = np.random.randint(1, 5, (5,4,3))
v = np.ones((5, 4), dtype=int)

在这种情况下说a是:

array([[[2, 1, 1],
        [3, 4, 4],
        [4, 3, 2],
        [2, 2, 2]],

       [[4, 4, 1],
        [3, 3, 4],
        [3, 4, 2],
        [1, 3, 1]],

       [[3, 1, 3],
        [4, 3, 1],
        [2, 1, 4],
        [1, 2, 2]],
        ...

通过索引np.ones数组:

print(v)

array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]])

您将简单地沿第一轴用a索引1多达v。当您这样做时,换一种说法:

a[1]

[[4, 4, 1],
 [3, 3, 4],
 [3, 4, 2],
 [1, 3, 1]]

您正在沿第一个轴分度,因为没有沿附加轴指定分度。这与进行a[1, ...]相同,即沿其余轴取一整片。因此,通过用2D数组组成的索引,可以将上述2D个数组(5, 4)堆叠在一起,得到形状为(5, 4, 4, 3)的ndarray。换句话说,a[1]的形状为(4,3),堆积了5*4=20次。

因此,在这种情况下,您将得到:

array([[[[4, 4, 1],
         [3, 3, 4],
         [3, 4, 2],
         [1, 3, 1]],

        [[4, 4, 1],
         [3, 3, 4],
         [3, 4, 2],
         [1, 3, 1]],
         ...

答案 1 :(得分:0)

a是具有2维的数组 v是具有3维的数组 数据是4维数组

当您使用2维数组访问3维数组时,会为其添加一个维。

想象一下,您为3d空间中的每个点应用了2d空间,它将为3d空间添加另一个尺寸。创建更大的4d空间。

那只是我的猜测,我真的是专家的对立面,所以我要回答我的问题哈哈!

答案 2 :(得分:0)

v的值是:

[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]

每个1都在a中索引一个完整的“行”,但是所说“行”中的每个“元素”都是一个矩阵。因此v中的每个“行”都在a中索引了“矩阵”的“行”。 (这对您有意义吗??)

所以您得到5 * 4 1,每个都是4 * 3的“矩阵”。

如果您将zeroes定义为a而不是a = np.arange(5*4*3).reshape((5, 4, 3)) 可能更容易理解,因为您可以看到正在选择a的哪些部分:

import numpy as np

a = np.arange(5*4*3).reshape((5, 4, 3))
v = np.ones((5,4), dtype=int)
data = a[v]
print(data)

(输出时间很长,我不想将其粘贴到此处)