Я недавно видел явление в работе со структурированными массивами 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.]
Мы ясно видим здесь, что вторая операция не имела никакого эффекта. Если бы кто-нибудь мог объяснить, почему это происходит, было бы весьма полезно.
не будет ли это 'номинальныйArray [" t "] [timeGreaterThan5] - = 10' –
@PadraicCunningham Это устранит проблему. Мне просто интересно, почему это решение. Что такого особенного в заказе здесь? – tintedFrantic
Теперь я получаю вас, они оба возвращают разные объекты, один - это вид, а другой - нет, я предполагаю, что продвинутый vs нормальный индекс, 'initialArray [timeGreaterThan5]' возвращает '[(16.0, [0.0, 0.0, 0.0], [ 0.0, 0.0, 0.0]) ... 'поэтому срез, возвращаемый с' номинальныйArray [timeGreaterThan5] ', не является объектом вида –