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

Gul*_*zar 8 python arrays numpy

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

该代码给出 shp==(5,4,4,3)

我不明白为什么。如何输出更大的数组?对我来说没有任何意义,希望您能提供一个解释。

yat*_*atu 6

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

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

a = np.random.randint(1, 5, (5,4,3))
v = np.ones((5, 4), dtype=int)
Run Code Online (Sandbox Code Playgroud)

在这种情况下说的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]],
        ...
Run Code Online (Sandbox Code Playgroud)

通过使用以下数组建立索引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]])
Run Code Online (Sandbox Code Playgroud)

你会简单地索引a具有1沿第一轴多次v。换句话说,当您这样做时:

a[1]

[[4, 4, 1],
 [3, 3, 4],
 [3, 4, 2],
 [1, 3, 1]]
Run Code Online (Sandbox Code Playgroud)

您正在沿第一个轴分度,因为没有沿附加轴指定分度。这与执行操作相同a[1, ...],即沿其余轴取一整片。因此,通过对一个2D数组进行索引,可以将上述2D数组(5, 4)时间堆叠在一起,从而得到shape的ndarray (5, 4, 4, 3)。或换句话说,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]],
         ...
Run Code Online (Sandbox Code Playgroud)