使用2D数组索引1D Numpy数组

3
在Numpy中,我们可以使用一个二维数组作为一个一维数组的索引吗?下面的代码应用了哪个数组索引规则?
# 1D array
arr = np.arange(10)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

# 2D index 
indx = np.array([[2, 4], [6, 8]])

# 2D index in 1D array
arr[indx]

# Output of above indexing is a 2D array!
array([[2, 4],[6, 8]])

你能澄清一下你的意思吗?你发布的代码可以正常工作,是的,你可以使用一个二维数组来索引一个一维数组。 - user3483203
我在NumPy文档中找不到这个规则,请问能否提供相关的文档,讨论这种类型的索引。我知道这种方法可行,但我想要了解为什么。 - Saurabhp75
文档中可以看到:“与列表和元组不同,numpy数组支持多维索引,适用于多维数组。”但是如何实现并不是很清楚。 - user2314737
这正是我想要理解的内容。通过实验可以看出,我们可以使用N维数组来索引一个一维数组。只要索引在一维数组的范围内,输出将会是一个N维数组。 - Saurabhp75
我相信只要数组的元素是原始数组(在本例中为整数0..9)的有效索引,那么你可以将任何大小和形状的数组作为索引。 - user2314737
1个回答

1
以下代码使用了什么数组索引规则?
这就是NumPy高级索引的工作原理。结果数组的形状与索引数组的形状、数组的形状和传递索引的轴有关。以下是一些示例,将3D数组作为索引传递给具有不同形状的数组的第一个轴。
In [47]: a.shape
Out[47]: (2, 5)

In [48]: b = a[np.array([[[0],[1]],[[1],[1]]])]

In [49]: b.shape
Out[49]: (2, 2, 1, 5)

In [50]: arr.shape
Out[50]: (3, 3, 3)

In [51]: b = arr[np.array([[[0],[1]],[[1],[1]]])]

In [52]: b.shape
Out[52]: (2, 2, 1, 3, 3)

当您将不同的数组传递给不同的轴时,您会得到以下结果:

In [61]: b = arr[[[0],[2]],[[1],[0]]]

In [62]: b.shape
Out[62]: (2, 1, 3)

In [63]: arr.shape
Out[63]: (3, 3, 3)

在所有这些索引操作中,Numpy会检查多个方面。首先,它会检查传递给索引的对象类型。其次,它会将您的索引数组的形状与数组各个轴的形状进行比较。第三,它会检查结果是否产生有效的Numpy数组。
以下是其他一些示例:
In [64]: b = arr[[[[0],[2]]],[[1],[0]]]

In [65]: b.shape
Out[65]: (1, 2, 1, 3)

In [66]: b
Out[66]: 
array([[[[ 3,  4,  5]],

        [[18, 19, 20]]]])

In [67]: b = arr[[[[0],[2]]],[1],[0]]

In [68]: b
Out[68]: 
array([[[ 3],
        [21]]])

In [69]: b = arr[[[['a'],[2]]],[1],[0]]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-69-dba030ba9787> in <module>()
----> 1 b = arr[[[['a'],[2]]],[1],[0]]

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

In [70]: b = arr[[[[0],[2]]],[1],0]

In [71]: b = arr[[[[0],[2]]],[5],0]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-71-0962012e570a> in <module>()
----> 1 b = arr[[[[0],[2]]],[5],0]

IndexError: index 5 is out of bounds for axis 1 with size 3

In [72]: 

In [72]: b = arr[[[[0],[[2]]]],[5],0]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-72-9a520b0cb30e> in <module>()
----> 1 b = arr[[[[0],[[2]]]],[5],0]

ValueError: setting an array element with a sequence.

In [73]: b = arr[[[[0],[[2]]]],[5],[0]]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-73-67187db6f452> in <module>()
----> 1 b = arr[[[[0],[[2]]]],[5],[0]]

ValueError: setting an array element with a sequence.

谢谢,我可以从上面得出的结论是,只要索引数组元素在被索引的数组范围内,我们就会得到有效的输出。输出的形状是被索引数组的形状,其中被索引的轴被替换为索引数组的形状。例如,索引数组形状indx =(x1,x2,... xn),要索引的数组arr =(y1,y2 .... ym)的形状。在arr的轴'k'上使用indx数组的输出形状=(y1,y2 ... yk-1,x1,x2,..,xn,..yk,yk + 1.,,,ym)。 - Saurabhp75
@user8579809 有点类似,但并不完全相同。你不能简单地确定结果的形状,因为有多种情况,而且它们会根据多个规则生成结果(尽管相似)。 - Mazdak
1
最好的方法是尝试使用不同形状的数组和索引。 - Mazdak
我用这个方法将一个一维数组赋值给二维数组的索引...它也能正常工作,但我不知道为什么... - Joao_PS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接