【问题标题】:Numpy indexing multidimensional arrays with array and slice带有数组和切片的 Numpy 索引多维数组
【发布时间】:2015-10-23 09:58:29
【问题描述】:

我怀疑 numpy 文档中的 this example

y = np.arange(35).reshape(5,7)

这是我要澄清的操作:

y[np.array([0,2,4]),1:3]

根据文档:
“实际上,切片转换为索引数组 np.array([[1,2]]) (shape (1,2)) 与索引数组一起广播以生成形状为 (3,2 )。”

这不起作用,所以我假设它不等效

y[np.array([0,2,4]), np.array([1,2])]

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-140-f4cd35e70141> in <module>()
----> 1 y[np.array([0,2,4]), np.array([1,2])]

ValueError: shape mismatch: objects cannot be broadcast to a single shape

这个广播的形状 (3,2) 的数组是什么样子的?

【问题讨论】:

  • 好收获。我从来没有使用过那种特定的使用模式,但这个结果肯定是出乎意料的。尝试使用 np.array([1,2])[:, None] 作为第二个参数,使您的“列索引数组”看起来像一列。

标签: python numpy multidimensional-array


【解决方案1】:

广播更像:

In [280]: y[np.array([0,2,4])[...,None], np.array([1,2])]
Out[280]: 
array([[ 1,  2],
       [15, 16],
       [29, 30]])

我向[0,2,4] 添加了一个维度,使其成为2d。 broadcast_arrays 可用于查看广播的数组长什么样:

In [281]: np.broadcast_arrays(np.array([0,2,4])[...,None], np.array([1,2]))
Out[281]: 
[array([[0, 0],
        [2, 2],
        [4, 4]]), 
 array([[1, 2],
        [1, 2],
        [1, 2]])]

np.broadcast_arrays([[0],[2],[4]], [1,2]) 与没有 array 包装器的情况相同。 np.meshgrid([0,2,4], [1,2], indexing='ij') 是生成这些索引数组的另一种方式。

meshgridbroadcast_arrays 生成的列表可以用作y[_] 的参数。)

所以说[1,2]用索引数组广播是对的,但是它省略了关于调整尺寸的那一点。

早一点他们就有这个例子:

y[np.array([0,2,4])]

相当于y[np.array([0,2,4]), :]。它选择 3 行,以及其中的所有项目。 1:3 的情况可以被认为是这种情况的扩展,选择 3 行,然后是 2 列。

y[[0,2,4],:][:,1:3]

如果广播太混乱,这可能是考虑索引的更好方法。


还有另一个文档页面可以更好地处理这个问题

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

在本文档中,基本索引涉及切片和整数

y[:,1:3], y[1,:], y[1, 1:3]

高级索引涉及数组(或列表)

y[[0,2,4],:]

这产生与y[::2,:] 相同的结果,除了列表情况产生一个副本,切片(基本)一个视图。

y[[0,2,4], [1,2,3]]是纯高级索引数组索引的情况,结果是3项,分别在(0,1)(2,2)(4,3)

y[[0,2,4], 1:3] 是这个文档调用Combining advanced and basic indexing 的情况,“高级”来自“[0,2,4]”,基本来自“1:3”。

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing


查看更复杂的索引数组可能会增加一些洞察力。

In [222]: i=[[0,2],[1,4]]

与另一个列表一起使用,它是'纯'高级,结果被广播:

In [224]: y[i, [1,2]]
Out[224]: 
array([[ 1, 16],
       [ 8, 30]])

索引数组是:

In [234]: np.broadcast_arrays(i, [1,2])
Out[234]: 
[array([[0, 2],
        [1, 4]]), 
 array([[1, 2],
        [1, 2]])]

[1,2] 列表刚刚扩展为 (2,2) 数组。

将它与切片一起使用是这种混合高级/基本的示例,结果是 3d (2,2,2)

In [223]: y[i, 1:3]
Out[223]: 
array([[[ 1,  2],
        [15, 16]],

       [[ 8,  9],
        [29, 30]]])

广播的等价物是

y[np.array(i)[...,None], [1,2]]

【讨论】:

    【解决方案2】:

    y[data,beginIndex:endIndex]

       import numpy as np
        y = np.arange(35).reshape(5,7)
        print(y)
        [[ 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 27]
         [28 29 30 31 32 33 34]]
        print(y[np.array([0,2,4]),1:3])
        [[ 1  2]
         [15 16]
         [29 30]]
    

    【讨论】:

      【解决方案3】:

      您说得对,这里的文档可能不正确,或者至少缺少某些内容。我会为此提交an issue,以便在文档中进行澄清。

      事实上,文档中的this part 仅显示了这个示例,但是除了你被提出来之外:

      >>> y[np.array([0,2,4]), np.array([0,1])]
      <type 'exceptions.ValueError'>: shape mismatch: objects cannot be
      broadcast to a single shape
      

      【讨论】:

        猜你喜欢
        • 2015-02-02
        • 2021-11-23
        • 2018-11-07
        • 2017-09-20
        • 1970-01-01
        • 2017-06-24
        • 2019-05-09
        • 2015-04-19
        相关资源
        最近更新 更多