【发布时间】:2018-05-19 02:26:13
【问题描述】:
我一遍又一遍地遇到这个问题,似乎无法找到一个干净的解决方案。所以我试图用另一个数组索引一个数组。我有一个二维 numpy 数组。还有一个 1d numpy 数组,其长度与我尝试索引的 2d 数组的第一个维度相同,元素代表我尝试提取的列的索引:
import numpy as np
A = np.random.rand((5,3))
B = np.asarray([2,1,2,0,1])
我想要的行为是为所有行提取数组 B 中的相应列。这可以通过
C = A[np.arange(A.shape[0]),B]
但我可以想象有更好的方法来获得这种行为。使用 : 作为索引第一行会给出错误的行为。
如果有更清洁的方式来做这件事,那就太好了。我真的习惯了 Matlab 中的这个数组索引,但也许在 numpy 中没有等价物。使用布尔索引当然是一种选择,但这也需要一直转换数组。
【问题讨论】:
-
将
A[np.arange(A.shape[0]),B]包装在一个函数中并调用它really_clean_solution()? -
您将如何在 MATLAB 中编写此代码? MATLAB 对成对和块索引的处理是不同的。
-
@Divakar 的非讽刺变体:
def rl_(I): return np.arange(I.size)rl 代表 range_like。A[rl_(B), B]还不错吧? -
说真的,在 MATLAB 中执行此操作的更简洁的方法是什么?我一定是用那种语言过时了,但我找不到它。