2016-11-13 144 views
0

我試圖索引某個矩陣,y,然後用某個布爾語句重新索引該結果,並將y中的對應元素設置爲0。下面顯示了我用來測試這種索引方案的僞代碼。設置索引索引數組時的Numpy數組值

x=np.zeros([5,4])+0.1; 
y=x; 
print(x) 
m=np.array([0,2,3]); 
y[0:4,m][y[0:4,m]<0.5]=0; 
print(y) 

我不確定爲什麼它不起作用。輸出我想:

[[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1]] 
[[ 0. 0.1 0. 0. ] 
[ 0. 0.1 0. 0. ] 
[ 0. 0.1 0. 0. ] 
[ 0. 0.1 0. 0. ] 
[ 0.1 0.1 0.1 0.1]] 

但我實際上得到:

[[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1]] 
[[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1]] 

我敢肯定,我錯過了一些在引擎蓋細節,解釋了爲什麼這是行不通的。有趣的是,如果您將m替換爲:,那麼分配工作。出於某種原因,選擇列的一個子集不會讓我分配零。

如果有人可以解釋發生了什麼,並幫助我找到一種替代解決方案(希望這種解決方案不涉及生成臨時numpy陣列,因爲我的實際y將會非常巨大),我會非常感激!謝謝!

編輯: y[0:4,:][y[0:4,:]<0.5]=0; y[0:4,0:3][y[0:4,0:3]<0.5]=0;

如預期的所有工作。看起來問題是當你用某種列表進行索引時。

+0

你可能會使用一些隨機數而不是所有的'0.1',像'np.random.rand(5,4)'這樣的輸入,並顯示我們預期的輸出? – Divakar

+0

我最初使用所有隨機數進行測試,這是我最初遇到問題的地方。只是因爲它具有更高的可重複性,我轉而使用所有的「0.1」。 –

+0

你可以在開始時使用'np.random.seed(1234)'來獲得可重複的隨機數。 – Divakar

回答

0

製造陣列(這是我的最愛之一,因爲值不同):

In [845]: x=np.arange(12).reshape(3,4) 
In [846]: x 
Out[846]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
In [847]: m=np.array([0,2,3]) 
In [848]: x[:,m] 
Out[848]: 
array([[ 0, 2, 3], 
     [ 4, 6, 7], 
     [ 8, 10, 11]]) 
In [849]: x[:,m][:2,:]=0 
In [850]: x 
Out[850]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 

沒有變化。但是如果我一步完成索引,它就會改變。

In [853]: x[:2,:][:,m]=10 
In [854]: x 
Out[854]: 
array([[10, 1, 10, 10], 
     [10, 5, 10, 10], 
     [ 8, 9, 10, 11]]) 

x[i,j]x.__getitem__((i,j))執行:

In [851]: x[:2,m]=0 
In [852]: x 
Out[852]: 
array([[ 0, 1, 0, 0], 
     [ 0, 5, 0, 0], 
     [ 8, 9, 10, 11]]) 

如果我顛倒順序它也適用。 x[i,j]=v as x.__setitem__((i,j),v)

x[i,j][k,l]=vx.__getitem__((i,j)).__setitem__((k,l),v)

set適用於由get產生的值。如果get返回一個視圖,則更改會影響x。但是,如果它生成副本,更改不會影響x

與數組m,y[0:4,m]產生副本(我需要證明這一點?)。 y[0:4,:]產生一個視圖。

因此,簡而言之,如果第一個索引產生一個視圖,第二個索引賦值就起作用。但是,如果產生副本,第二個沒有效果。

+0

這是有道理的,謝謝。在我的情況下,是否有可能在一個索引步驟中做我想做的事情? –