花哨的数组索引到每个不同的列索引中

2024-09-22 16:29:09 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个mxn数组。对于每一行,我有要访问的s(带有s<;=n)个条目。每行的条目数s是相同的,但是它们的索引不同。我想索引到x并提取这个mxs子数组。在

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

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]])

下面是我想从每一行输入的内容:

^{pr2}$

这个数组表示从第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。在


Tags: importltnumpyasnp条目colscipy
3条回答

由于我们需要访问每行上的3列,因此我们需要重复每行的索引3次,我们可以使用^{}来完成此操作,现在使用重复的行索引和col_ix的扁平版本,我们可以对x执行multi-dimensional indexing

>>> x[np.repeat(np.arange(a), col_ix.shape[1]), col_ix.ravel()].reshape(col_ix.shape)
array([[ 0,  1,  2],
       [ 6,  7,  8],
       [10, 12, 14],
       [18, 19, 17]])

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

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

这仍然通过col_ix.shape[1]中间产物生成x.shape。只要你的实际数组不是太大就可以了。在

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]])

相关问题 更多 >