gpt4 book ai didi

python - 在 numpy 中使用列表和数组进行索引似乎不一致

转载 作者:太空狗 更新时间:2023-10-30 00:12:57 25 4
gpt4 key购买 nike

灵感来自 this other question , 我正在努力思考 advanced indexing在 NumPy 中建立对其工作原理的更直观的理解。

我发现了一个有趣的案例。这是一个数组:

>>> y = np.arange(10)
>>> y
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

如果我将它索引为一个标量,我当然会得到一个标量:

>>> y[4]
4

使用一维整数数组,我得到另一个一维数组:

>>> idx = [4, 3, 2, 1]
>>> y[idx]
array([4, 3, 2, 1])

因此,如果我用一个二维整数数组对其进行索引,我会得到...我会得到什么?

>>> idx = [[4, 3], [2, 1]]
>>> y[idx]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array

哦不!对称性被打破。我必须使用 3D 数组进行索引才能获得 2D 数组!

>>> idx = [[[4, 3], [2, 1]]]
>>> y[idx]
array([[4, 3],
[2, 1]])

是什么让 numpy 以这种方式运行?

为了让这更有趣,我注意到使用 numpy 数组(而不是列表)进行索引的行为符合我的直觉预期,而 2D 为我提供了 2D:

>>> idx = np.array([[4, 3], [2, 1]])
>>> y[idx]
array([[4, 3],
[2, 1]])

这看起来与我所处的位置不一致。这里的规则是什么?

最佳答案

原因是将列表解释为 numpy 数组的索引:列表被解释为元组,而元组索引被 NumPy 解释为多维索引。

就像 arr[1, 2] 返回元素 arr[1][2] arr[[[4, 3], [2 , 1]]] 等同于 arr[[4, 3], [2, 1]] 并且会根据多维索引的规则返回元素 arr [4, 2]arr[3, 1]

通过再添加一个列表,您确实告诉 NumPy 您想要沿第一维进行切片,因为最外层的列表被有效地解释为好像您只传入了一个“第一维的索引列表”:arr[ [[[4, 3], [2, 1]]]]

来自documentation :

Example

From each row, a specific element should be selected. The row index is just [0, 1, 2] and the column index specifies the element to choose for the corresponding row, here [0, 1, 0]. Using both together the task can be solved using advanced indexing:

>>> x = np.array([[1, 2], [3, 4], [5, 6]])
>>> x[[0, 1, 2], [0, 1, 0]]
array([1, 4, 5])

and :

Warning

The definition of advanced indexing means that x[(1,2,3),] is fundamentally different than x[(1,2,3)]. The latter is equivalent to x[1,2,3] which will trigger basic selection while the former will trigger advanced indexing. Be sure to understand why this occurs.

在这种情况下,最好使用 np.take :

>>> y.take([[4, 3], [2, 1]])  # 2D array
array([[4, 3],
[2, 1]])

This function [np.take] does the same thing as “fancy” indexing (indexing arrays using arrays); however, it can be easier to use if you need elements along a given axis.

或者将索引转换为数组。 NumPy 以这种方式将它(array 是特殊情况!)解释为奇特的索引而不是“多维索引”:

>>> y[np.asarray([[4, 3], [2, 1]])]
array([[4, 3],
[2, 1]])

关于python - 在 numpy 中使用列表和数组进行索引似乎不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46117127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com