花式数组索引到每行的不同列索引

时间:2014-11-25 19:59:20

标签: python numpy

假设我有一个m x n数组。对于每一行,我都有s(包含s< = n个条目,我想访问这些条目。每行的条目数s相同,但它们的索引不同。我想索引x并提取此m x s子阵列。

这是一个具体的例子。假设我有以下数组:

import numpy as np
import scipy.sparse

x = np.arange(4*5).reshape(-1,5)

Out[25]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

以下是我想要从每一行开始的条目:

col_ix = np.array([[0,1,2],[1,2,3],[0,2,4],[3,4,2]])

Out[36]:
array([[0, 1, 2],
       [1, 2, 3],
       [0, 2, 4],
       [3, 4, 2]])

这个数组表示从第0行开始,我想要输入0,1和2.从第1行开始,我想要输入1,2和3,依此类推。结果应该是:

array([[ 0,  1,  2],
       [ 6,  7,  8],
       [10, 12, 14],
       [18, 19, 17]])

我能够通过写:

获得上述结果
x[[[_] for _ in xrange(len(x))], col_ix]

本质上是这样的:

x[[[0],[1],[2],[3]], col_ix]

但我觉得好像有更好的方法。我应该注意,最终目标是为该子阵列的每个条目指定零。

3 个答案:

答案 0 :(得分:4)

IIUC,您是否可以利用该范围内的广播?也许像是

In [32]: x[np.arange(len(x))[:,None], col_ix]
Out[32]: 
array([[ 0,  1,  2],
       [ 6,  7,  8],
       [10, 12, 14],
       [18, 19, 17]])

答案 1 :(得分:0)

由于我们需要访问每行3列,我们需要重复每行3次索引,我们可以使用numpy.repeat执行此操作,现在使用重复行索引和展平版本{{ 1}}我们可以在col_ix上执行multi-dimensional indexing

x

答案 2 :(得分:0)

很难想出一种在不首先扩展矩阵的情况下顺序选择行的方法,就像在Ashwini的回答中一样。我想过使用:

x[:, col_ix].reshape([-1, col_ix.shape[1]])[0::x.shape[1], :]

这仍然会产生x.shape col_ix.shape[1]个中间人。只要您的实际数组不是太大,它就可以了。