У меня есть большой массив numpy, которым мне нужно манипулировать, чтобы каждый элемент изменялся либо на 1, либо на 0, если выполняется условие (позже будет использоваться как пиксельная маска). В массиве около 8 миллионов элементов, и мой текущий метод занимает слишком много времени для конвейера сокращения:
for (y,x), value in numpy.ndenumerate(mask_data):
if mask_data[y,x]<3: #Good Pixel
mask_data[y,x]=1
elif mask_data[y,x]>3: #Bad Pixel
mask_data[y,x]=0
Есть ли функция numpy, которая ускорит это?
Что вы хотите, чтобы произошло, если mask_data[y,x]==3? DSM 04.11.2013
Хороший момент, это все равно будет плохой пиксель. Я изменю условие на if mask_data[y,x]>=3: ChrisFro 04.11.2013
Самый быстрый (и наиболее гибкий) способ - использовать np.where, который выбирает между двумя массивами в соответствии с маской (массив истинных и ложных значений):
import numpy as np
a = np.random.randint(0, 5, size=(5, 4))
b = np.where(a<3,0,1)
print('a:',a)
print()
print('b:',b)
Вы можете создать свой массив масок за один шаг, как это
mask_data = input_mask_data < 3
Это создает логический массив, который затем можно использовать в качестве пиксельной маски. Обратите внимание, что мы не изменили входной массив (как в вашем коде), а создали новый массив для хранения данных маски - я бы рекомендовал сделать это именно так.