假设我有一个矩阵v:
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
我还有一个向量col_indices = [0,0,1,2,2,1],它指示我应该为矩阵v的每一行放一个1。
在这种情况下,任务的结果应该是:
1 0 0
1 0 0
0 1 0
0 0 1
0 0 1
0 1 0
以下代码有效:
v[np.arange(v.shape[0]), col_indices] = 1
但是我想知道是否有一种聪明的方法来实现这一点,因为在上面的代码中我必须创建一个向量来索引矩阵,这看起来很浪费。
我也尝试过以下代码,但它没有做我想要的事情:
v[:, col_indices] = 1
答案 0 :(得分:4)
这是进行索引的切割方法。
看看这些时间。生成该数组并不需要很长时间。实际上索引这些点需要更长的时间。
In [208]: x=np.zeros((10000,10000))
In [209]: timeit np.arange(x.shape[0]),np.arange(x.shape[1])
10000 loops, best of 3: 23.5 us per loop
In [210]: timeit x[np.arange(x.shape[0]),np.arange(x.shape[1])]=1
1 loops, best of 3: 1.88 ms per loop
几个星期前的类似问题是 numpy shorthand for taking jagged slice
海报想要a[:, entries_of_interest]
之类的简单而不是a[np.arange(a.shape[0]), entries_of_interest]
。我认为这只是a[I, J]
的一个特例(对于任何一对匹配的索引数组)。