使用另一个2D阵列索引NumPy 2D阵列

Fra*_*ter 5 python indexing numpy scipy

我有类似的东西

m = array([[1, 2],
            [4, 5],
            [7, 8],
            [6, 2]])
Run Code Online (Sandbox Code Playgroud)

select = array([0,1,0,0])
Run Code Online (Sandbox Code Playgroud)

我的目标是

result = array([1, 5, 7, 6])
Run Code Online (Sandbox Code Playgroud)

当我读到Simplfy行和列提取时,我尝试了_ix ,numpy,但这并没有导致我想要的结果.

ps如果您能想到更精确的问题,请更改此问题的标题.

seb*_*erg 12

执行此操作的numpy方法是使用np.choose或花式索引/获取(见下文):

m = array([[1, 2],
           [4, 5],
           [7, 8],
           [6, 2]])
select = array([0,1,0,0])

result = np.choose(select, m.T)
Run Code Online (Sandbox Code Playgroud)

所以没有必要使用python循环或任何东西,numpy给你的所有速度优势.m.T只是需要因为选择实际上是两个数组之间的选择np.choose(select, (m[:,0], m[:1])),但它直接使用它就像这样.


使用花式索引:

result = m[np.arange(len(select)), select]
Run Code Online (Sandbox Code Playgroud)

如果速度非常重要np.take,它可以在一维视图上工作(由于某些原因,速度相当快,但可能不适用于这些微小的数组):

result = m.take(select+np.arange(0, len(select) * m.shape[1], m.shape[1]))
Run Code Online (Sandbox Code Playgroud)


Nir*_*iel 1

使用Python怎么样?

result = array([subarray[index] for subarray, index in zip(m, select)])
Run Code Online (Sandbox Code Playgroud)