假设我有一个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]
但我觉得好像有更好的方法。我应该注意,最终目标是为该子阵列的每个条目指定零。
答案 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]
个中间人。只要您的实际数组不是太大,它就可以了。