最近、構造化された 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.]
ここでは、2 番目の操作が影響を与えていないことがはっきりとわかります。なぜこれが起こるのか誰かが説明できれば、それは大歓迎です。