如果更改了numpy數組視圖,原始數組也會被更改。這是預期的行爲。numpy數組視圖視圖是副本?
arr = np.array([1,2,3])
mask = np.array([True, False, False])
arr[mask] = 0
arr
# Out: array([0, 2, 3])
但是,如果我採取這樣的視點的視點,並更改,那麼原來的數組是不改變:
arr = np.array([1,2,3])
mask_1 = np.array([True, False, False])
mask_1_arr = arr[mask_1] # Becomes: array([1])
mask_2 = np.array([True])
mask_1_arr[mask_2] = 0
arr
# Out: array([1, 2, 3])
這意味着,我認爲,當你把一個一個視圖的觀點,你實際上得到一份副本。它是否正確?爲什麼是這樣?
如果我使用數字索引的numpy數組而不是布爾值的numpy數組,則會發生相同的行爲。 (例如,arr[np.array([0])][np.array([0])] = 0
不會將arr
的第一個元素更改爲0.)
這一切都有道理!那麼我想,有沒有簡單的方法來做一個像'arr [x] [y] = 1'這樣的單線程。現在我通過分配一箇中間值來完成這個工作,例如'int = arr [x]'; 'int [y] = 1'; 'arr [x] = int'。 – acdr
如果'x'是一個布爾掩碼,則一行等價物將是'np.put(arr,np.flatnonzero(x)[y],1)'。 'np.flatnonzero(x)'將布爾掩碼轉換爲一維整數數組。然後,您可以使用'np.flatnonzero(x)[y]'選擇這些整數的一些子集,其中'y'可以是基本切片或高級索引器。然後'np.put(arr,np.flatnonzero(x)[y],1)'因爲它大致等於'arr.flat [np.flatnonzero(x)[y]] = 1'。 – unutbu
如果'arr'是一維的,'arr [np.flatnonzero(x)[y]] = 1'也適用。上面的'np.put'的目的是提供一個即使'arr'是n維也可以工作的答案。 – unutbu