3
當使用numpy的命名陣列我觀察在以下兩種情況下不同的行爲:意外行爲
- 情況下:首先使用用於高級切片索引陣列,然後通過選擇一個子陣列命名
- 情況下:第一選擇由名稱的子陣列,然後使用先進的索引陣列切片
的follwing代碼提出的實施例
import numpy as np
a = np.ones(5)
data = np.array(zip(a, a, a), dtype=[("x", float), ("y", float), ("z", float)])
# case 1
# does not set elements 1, 3 and 4 of data to 22
data[[1, 3, 4]]["y"] = 22
print data["y"] # -> [ 1. 1. 1. 1. 1.]
# case 2
# set elements 1, 3 and 4 of data to 22
data["y"][[1, 3, 4]] = 22
print data["y"] # -> [ 1. 22. 1. 22. 22.]
兩個打印命令的輸出是 [1.1.1.1.1]和[1.22.1 22. 22.]。爲什麼在設置元素時改變選擇的順序會導致不同的結果?
正如你所說的用列表或數組索引總是返回一個副本而不是視圖。這解釋了爲什麼data [[1,3,4]] [「y」] = 22'正在處理'data'的副本。但出於同樣的原因,data [「y」] [[1,3,4]]只應該在data [「y」]的副本上工作。這也顯示了'np.may_share_memory(data,data [「y」] [[1,3,4]])',它變成了'False'。所以我不明白爲什麼這個排序工作。 – murban
可以使用索引表達式來分配元素,只要您直接執行分配,而不會鏈接任何其他索引操作,索引表達式就會返回副本。例如,'x [[1,2,3]] = 4,5,6'將起作用,但'x [[1,2,3]] [:] = 4,5,6'不會影響'因爲第一個索引表達式返回一個副本。 –