Numpy:完成v [np.arange(v.shape [0]),col_indices] = 1的聪明​​方法?

时间:2015-12-03 03:08:27

标签: python numpy

假设我有一个矩阵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

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]的一个特例(对于任何一对匹配的索引数组)。