我对numpy文档中的这个例子有疑问。
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)数组是什么样的?
广播更像是:
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')
是生成这些索引数组的另一种方法。
(meshgrid
或broadcast_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
的情况,'advanced' from ' [0,2,4]', ' basic ' from '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]]
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]]
您是对的,这里的文档可能不正确,或者至少缺少了一些东西。我会为此提出一个问题,在文档中进行澄清。
实际上,文档的这一部分只展示了这个例子,但是随后会引发一个异常:
>>> y[np.array([0,2,4]), np.array([0,1])]
<type 'exceptions.ValueError'>: shape mismatch: objects cannot be
broadcast to a single shape