>>> idx = np.random.randint(2, size=(9, 31))
>>> a = np.random.random((9, 31, 2))
>>> a[idx].shape
(9, 31, 31, 2)
为什么上述内容不至少导致(9, 31, 1)
或更好(9, 31)
的形状?如何根据idx
?
更新
这可能是一个更具体,更有希望的类比例子:假设这个数组
a = np.asarray([[1, 2], [3, 4], [5, 6], [7, 8]])
我如何选择数组[1, 4, 5, 8]
(即每行的第0个,第1个,第0个,第1个元素)?
答案 0 :(得分:3)
我认为这就是你想要的:
>>> a[np.arange(9)[:, None], np.arange(31), idx].shape
(9, 31)
对于你的第二个例子,你会这样做:
>>> a[np.arange(4), [0, 1, 0, 1]]
array([1, 4, 5, 8])
阅读有关精确索引的the docs,尤其是关于每个维度here没有索引数组时会发生什么的部分:那些额外的np.arange
数组放在那里以避免那种行为。
还要注意它们是如何重新整形的(使用[:, None]
建立索引相当于.reshape(-1, 1)
),以便它们的广播形状具有所需输出数组的形状。
答案 1 :(得分:0)
我认为您正在尝试使用a
的元素索引idx
的元素。您可以使用Python中的map
执行此操作:
map(lambda subarray, index: subarray[index], a, idx)
返回一个列表,以获得一个numpy数组:
np.asarray(map(lambda subarray, index: subarray[index], a, idx))
<强>更新强>
使用您更新的示例进行说明:
a = np.asarray([[1, 2], [3, 4], [5, 6], [7, 8]])
idx = np.asarray([0, 1, 0, 1])
print np.asarray(map(lambda subarray, index: subarray[index], a, idx))
# [1 4 5 8]
请注意,这与numpy无关,所以我们可以取出所有np.asarray
内容,这对列表也很好。
答案 2 :(得分:-1)
您正在对ndarray http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced-indexing进行高级索引编制。
高级索引始终作为一个广播和迭代:
这是触发的,因为在您的情况下,ndarray-index中的元素数量不等于您要编入索引的ndarray中的维度数。实际上,您可以生成切片的外积:索引中的每个元素都会生成索引数组的切片,而不是元素。
更新:
>>> map(lambda idx: a[idx[0],idx[1]], [[0,0], [1,1], [2,0], [3,1]])
这将返回:
[1, 4, 5, 8]