2015-12-03 28 views
1

假設我有一個矩陣V:Numpy:完成v [np.arange(v.shape [0]),col_indices] = 1的聰明​​方法?

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],表示哪一列我應該把一個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 

回答

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]的特例(對於任何匹配的索引數組對)。

相關問題