2014-09-10 70 views
6

我有一個n行大小爲3的numpy數組A.每行由三個整數組成,每個整數指向numpy數組內的另一個位置。例如,如果我要使用N[4]表示的行,我使用N[N[4]]。目測:numpy數組中的奇怪賦值

N = np.array([[2, 3, 6], [12, 6, 9], [3, 10, 7], [8, 5, 6], [3, 1, 0] ... ]) 
N[4] = [3, 1 ,0] 
N[N[4]] = [[8, 5, 6] 
      [12, 6, 9] 
      [2, 3, 6]] 

我建立修飾N A功能,並且我需要修改N [N [X]]對於一些指定的x,它是(在實施例4)的參數也。我想改變所有的6子數組中的另一個號碼(假設0),所以我用numpy.where找到索引,這是

where_is_6 = np.where(N[N[4]] == 6) 

現在,如果我直接替換像N[N[4]][where_is_6] = 0沒有更改。如果我使用以前的參考像var = N[N[4]]然後var[where_is_6]更改已完成,但在本地對該功能,並且N不會全局更改。在這種情況下我能做什麼?或者我做錯了什麼?

+0

另一個索引,索引將不會與您已經定義列表'N'的方式工作。你需要首先將N轉換爲'numpy.array()'。 – 2014-09-10 21:45:43

+0

我說這是一個numpy數組,代碼雖然沒有反映出來,現在正在編輯... – 2014-09-10 21:46:26

回答

6

聽起來像是你只需要轉換索引到原來N的座標:

row_idxs = N[4] 
r,c = np.where(N[row_idxs] == 6) 
N[row_idxs[r],c] = 0 
+0

+1的確可以解決問題! – 2014-09-10 21:40:54

+0

是的!謝謝!下次我需要修改的時候,我會這樣想。 – 2014-09-10 21:45:22

4

的問題是,N[N[4]]是一個新的數組,你可以做的檢查:

print(N[N[4]].flags) 

C_CONTIGUOUS : True 
F_CONTIGUOUS : False 
OWNDATA : True 
WRITEABLE : True 
ALIGNED : True 
UPDATEIFCOPY : False 

其中OWNDATA顯示了這個事實。

+0

感謝.flags提示!那麼我能做些什麼來做出改變? – 2014-09-10 21:36:41

+1

@AlejandroSazo好... perimosocordiae的答案似乎是一個很好的解決方案 – 2014-09-10 21:41:59