我最近在使用結構化numpy數組時看到了一種現象,這種現象沒有任何意義。我希望有人能幫助我理解正在發生的事情。我提供了一個最小的工作示例來說明問題。問題是這樣的:爲什麼對布爾索引結構化數組的賦值依賴於索引排序?
當索引用布爾面具結構化numpy的數組,這個工程:
arr['fieldName'][boolMask] += val
但以下不會:
arr[boolMask]['fieldName'] += val
這裏是一個最小的工作示例:
import numpy as np
myDtype = np.dtype([('t','<f8'),('p','<f8',(3,)),('v','<f4',(3,))])
nominalArray = np.zeros((10,),dtype=myDtype)
nominalArray['t'] = np.arange(10.)
# In real life, the other fields would also be populated
print "original times: {0}".format(nominalArray['t'])
# Add 10 to all times greater than 5
timeGreaterThan5 = nominalArray['t'] > 5
nominalArray['t'][timeGreaterThan5] += 10.
print "times after first operation: {0}".format(nominalArray['t'])
# Return those times to their original values
nominalArray[timeGreaterThan5]['t'] -= 10.
print "times after second operation: {0}".format(nominalArray['t'])
運行此產生以下輸出:
original times: [ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
times after first operation: [ 0. 1. 2. 3. 4. 5. 16. 17. 18. 19.]
times after second operation: [ 0. 1. 2. 3. 4. 5. 16. 17. 18. 19.]
我們在此清楚地看到第二個操作沒有效果。如果有人可以解釋爲什麼會發生這種情況,將不勝感激。
它不會是'nominalArray [「t」] [timeGreaterThan5] - = 10' –
@PadraicCunningham這將解決問題。我只是想知道爲什麼這是解決方案。這裏的排序有什麼特別之處? – tintedFrantic
我現在得到你,他們都返回不同的對象,一個是視圖,另一個不是,我想像高級與普通索引,'nominalArray [timeGreaterThan5]'返回'[(16.0,[0.0,0.0,0.0],[ 0.0,0.0,0.0])...'所以從'nominalArray [timeGreaterThan5]'返回的片不是查看對象 –