Numpy使用数组和切片索引多维数组

时间:2015-07-31 16:30:39

标签: python numpy multidimensional-array

我对numpy docs中的this example表示怀疑。

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

这是我想澄清的操作:

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

根据文件:
“实际上,切片被转换为索引数组np.array([[1,2]])(形状(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)看起来如何?

3 个答案:

答案 0 :(得分:1)

Y [数据,的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]]

答案 1 :(得分:1)

您说这里的文档可能不正确,或者至少缺少某些内容,这是对的。我要为此提交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

答案 2 :(得分: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,&#39; advanced&#39;来自`[0,2,4]&#39;,基本来自&#39; 1:3&#39;。

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

查看更复杂的索引数组可能会增加一些见解。

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

与其他列表一起使用,它是纯粹的&#39;先进,结果广播:

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]]