2017-04-14 48 views
1

我有一個3列數組。數組的第一列的值在1到10之間。我需要提取第一列爲1的所有行,並規格化此數組的第三列。然後重複同樣的事情,對於其中的第一列等於所有行2等正常化ndarray的切片

如果我運行這段代碼,它留下的數組不變:

for u in np.unique(x[:,0]): 
    mask= x[:, 0] == u 
    x[mask][:,2]=x[mask][:,2]/np.sum((x[mask][:,2])) 

如果我運行這個代碼等片,我看到r(我在循環中放置了一個打印r)實際上完全按照我的需要工作。唯一的一點是原始數組x不變。

for u in np.unique(x[:,0]): 
    r = x[x[:, 0] == u] 
    r[:,2]=r[:,2]/np.sum((x[x[:,0]==u][:,2])) 

這是爲什麼?我究竟做錯了什麼???

回答

1

下面是在考慮性能的替代量化方法使用np.uniquenp.bincount解決您的問題 -

tags = np.unique(x[:,0], return_inverse=1)[1] 
x[:,2] /= np.bincount(tags, x[:,2])[tags] 

爲了進一步提高性能,可避免使用np.unique並直接計算np.bincount(tags, xc[:,2])的等價物,同時利用第一列中的數字在110之間的事實,其中t他 -

np.bincount(xc[:,0].astype(int), xc[:,2], minlength=11)[1:] 

要更換tags,我們可以使用第一列,像這樣 -

tags = xc[:,0].astype(int)-1 
+0

謝謝隊友! – user3623123

1

請勿索引兩次。顯然然後創建一個源數組的副本。 使用x[mask,2]而不是x[mask][:,2]

for u in np.unique(x[:,0]): 
    mask= x[:, 0] == u 
    x[mask,2]=x[mask,2]/np.sum((x[mask,2])) 
+0

你是對的。我的錯!!!謝謝隊友 – user3623123