Python 使用数组和切片对多维数组进行Numpy索引

Python 使用数组和切片对多维数组进行Numpy索引,python,numpy,multidimensional-array,Python,Numpy,Multidimensional Array,我的怀疑是关于numpy文档的 y=np.arange(35)。重塑(5,7) 这就是我试图澄清的操作: y[np.数组([0,2,4]),1:3] 根据文件: 实际上,切片被转换为索引数组np.array([[1,2]])(shape(1,2)),该数组与索引数组一起广播,以生成shape(3,2)的结果数组 这不起作用,所以我假设它不是等效的 y[np.数组([0,2,4]),np.数组([1,2])] --------------------------------------------

我的怀疑是关于numpy文档的

y=np.arange(35)。重塑(5,7)

这就是我试图澄清的操作:

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

根据文件:
实际上,切片被转换为索引数组np.array([[1,2]])(shape(1,2)),该数组与索引数组一起广播,以生成shape(3,2)的结果数组

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

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

---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
---->1 y[np.数组([0,2,4]),np.数组([1,2])]
ValueError:形状不匹配:无法将对象广播到单个形状

这个形状(3,2)的广播数组看起来怎么样

y[数据,开始索引:结束索引]

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

您是对的,这里的文档可能不正确,或者至少缺少一些内容。我将在文件中对此进行归档,以便澄清

事实上,大多数文档仅显示了此示例,但除此之外,您会遇到以下问题:

>>> y[np.array([0,2,4]), np.array([0,1])]
<type 'exceptions.ValueError'>: shape mismatch: objects cannot be
broadcast to a single shape
>>y[np.数组([0,2,4]),np.数组([0,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<代码>广播阵列可用于查看广播阵列的外观:

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_数组([[0]、[2]、[4]]、[1,2])
是没有
数组包装的相同内容<代码>np.meshgrid([0,2,4],[1,2],index='ij')
是生成这些索引数组的另一种方法

(由
meshgrid
broadcast\u数组生成的列表可以用作
y[\u]
的参数)

所以说
[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]
如果广播太混乱,这可能是考虑索引的更好方法


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

在本文档中,基本索引包括切片和整数

y[:,1:3], y[1,:], y[1, 1:3]
高级索引涉及数组(或列表)

这将生成与
y[::2,:]
相同的结果,除了列表案例生成副本,切片(基本)视图

y[[0,2,4],[1,2,3]
是纯高级索引数组索引的一种情况,结果是3个项目,分别位于
(0,1)
(2,2)
(4,3)

y[[0,2,4],1:3]
是本文档称之为结合高级和基本索引的
,“高级”来自“[0,2,4]”,基本来自“1:3”


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

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)

广播的等价物是

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

抢手货我从未使用过这种特定的使用模式,但结果肯定是出乎意料的。尝试使用np.array([1,2])[:,None]作为第二个参数,使“列索引数组”看起来像列。
In [234]: np.broadcast_arrays(i, [1,2])
Out[234]: 
[array([[0, 2],
        [1, 4]]), 
 array([[1, 2],
        [1, 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]]