如何在 numpy 中计算数组中的数组?

How array in array is calculated in numpy?

import numpy as np
arr = np.arange(9, dtype = "float").reshape(3,3)
ind1 = np.array([[1,2],[0,1]])
ind2 = np.array([[0,2],[1,2]])
arr2 = arr[ind1,ind2]

大家好,

希望你平安健康!!!

我是 numpy 的新手,我在了解 numpy 的概念时遇到了上述问题。直到倒数第二行我都明白了,但最后一行我仍然无法理解它是如何发生的?

答案是[[3. 8.] [1.,5.]] 上面的问题是MCQ(所以用命中和试炼的方法得到答案)。

待在家里注意安全!!!

提前致谢。

这是索引数组的示例(如果您是 numpy 的新手,则不是一个基本概念)。 arr2 等同于:

arr2 = [ [arr[ind1[0,0], ind2[0,0]], arr[ind1[0,1], ind2[0,1]]], [arr[ind1[1,0], ind2[1,0]], arr[ind1[1,1], ind2[1,1]]] ]

print(arr2)
#[[3.0, 8.0], [1.0, 5.0]]

ind 数组是 (2,2) 的事实可能会使索引更难可视化。

In [41]: ind1, ind2
Out[41]: 
(array([[1, 2],
        [0, 1]]),
 array([[0, 2],
        [1, 2]]))

让我们弄清楚它们 - 相同的值,但在 1d 中:

In [42]: ind1.ravel(), ind2.ravel()
Out[42]: (array([1, 2, 0, 1]), array([0, 2, 1, 2]))

用那个元组索引 arr 产生相同的值,但是 1d:

In [43]: arr[_]
Out[43]: array([3, 8, 1, 5])

这些值是这样配对的:

In [45]: list(zip(*Out[42]))
Out[45]: [(1, 0), (2, 2), (0, 1), (1, 2)]
In [47]: [arr[ij] for ij in Out[45]]
Out[47]: [3, 8, 1, 5]

将其重塑回 (2,2) 以获得原始索引。

更一般地说,当使用数组进行索引时,它们是 broadcast 相互对立的。这些规则允许我们混合使用标量、一维数组和二维数组。这里虽然 broadcasting 很简单,因为两个数组具有相同的形状 (2,2).