Python 使用数组和切片对多维数组进行Numpy索引
我的怀疑是关于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])] --------------------------------------------
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]]