繁体   English   中英

使用NumPy数组作为NumPy数组的索引

[英]Using NumPy arrays as indices to NumPy arrays

我有一个3x3x3 NumPy数组:

>>> x = np.arange(27).reshape((3, 3, 3))
>>> x
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

现在,我创建一个普通的索引列表:

>>> i = [[0, 1, 2, 1], [2, 1, 0, 1], [1, 2, 0, 1]]

不出所料,我使用此列表作为索引得到了四个值:

>>> x[i]
array([ 7, 14, 18, 13])

但是,如果现在将i转换为NumPy数组,则不会得到相同的答案。

>>> j = np.asarray(i)
>>> x[j]
array([[[[ 0,  1,  2],
         [ 3,  4,  5],
         [ 6,  7,  8]],

        [[ 9, 10, 11],
         [12, 13, 14],
         [15, 16, 17]],

        [[18, 19, 20],
         [21, 22, 23],
         [24, 25, 26]],

       ...,
       [[[ 9, 10, 11],
         [12, 13, 14],
         [15, 16, 17]],

        [[18, 19, 20],
         [21, 22, 23],
         [24, 25, 26]],

        [[ 0,  1,  2],
         [ 3,  4,  5],
         [ 6,  7,  8]],

        [[ 9, 10, 11],
         [12, 13, 14],
         [15, 16, 17]]]])

为什么会这样呢? 为什么不能将NumPy数组用作NumPy数组的索引?

x[j]等于x[j,:,:]

In [163]: j.shape
Out[163]: (3, 4)

In [164]: x[j].shape
Out[164]: (3, 4, 3, 3)

生成的形状是j的形状,并与x的最后2个维度相连。 j只是从x的第一维中选择。

另一方面, x[i]等效于x[tuple(i)] ,即:

In [168]: x[[0, 1, 2, 1], [2, 1, 0, 1], [1, 2, 0, 1]]
Out[168]: array([ 7, 14, 18, 13])

实际上x(tuple(j)]会产生相同的4项数组。

索引numpy数组的不同方法可能会造成混淆。

索引数组或列表的形状如何影响输出的另一个示例:

In [170]: x[[[0, 1], [2, 1]], [[2, 1], [0, 1]], [[1, 2], [0, 1]]]
Out[170]: 
array([[ 7, 14],
       [18, 13]])

相同的项目,但为二维数组。

numpy文档 ,您正在做的是“整数数组索引”,您需要将每个坐标作为单独的数组传递:

j = [np.array(x) for x in i]

x[j]
Out[191]: array([ 7, 14, 18, 13])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM