我最近在使用结构化 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.]
我们在这里清楚地看到第二次操作没有效果。如果有人可以解释为什么会发生这种情况,将不胜感激。