2014-10-21 5 views
1

У меня есть np.ndarray с номерами, которые указывают на места, представляющие интерес, я заинтересован в пятнах, которые имеют значения 1 и 9.Применение маски для ускорения различных расчетов массива

Сейчас они извлекаются как таковой:

maskindex.append(np.where(extract.variables['mask'][0] == 1) or np.where(megadatalist[0].variables['mask'][0] == 9)) 

xval = maskindex[0][1] 
yval = maskindex[0][0] 

Мне нужно применить эти значения x и y к массивам, над которыми я работаю, чтобы ускорить работу.

У меня есть 140 массивов, каждый из которых 734 x 1468, мне нужно среднее, max, min, std, рассчитанное для каждого поля. И я надеялся, что там был легкий способ применения замаскированного массива для ускорения операций, прямо сейчас я просто делаю это на целых массивов, как например:

Average_List = np.mean([megadatalist[i].variables['analysed_sst'][0] for i in range(0,Numbers_of_datasets)], axis=0) 
Average_Error_List = np.mean([megadatalist[i].variables['analysis_error'][0] for i in range(0,Numbers_of_datasets)], axis=0) 
Std_List  = np.std([megadatalist[i].variables['analysed_sst'][0] for i in range(0,Numbers_of_datasets)], axis=0) 
Maximum_List = np.maximum.reduce([megadatalist[i].variables['analysed_sst'][0] for i in range(0,Numbers_of_datasets)]) 
Minimum_List = np.minimum.reduce([megadatalist[i].variables['analysed_sst'][0] for i in range(0,Numbers_of_datasets)]) 

Любые идеи о том, как ускорить процесс будет высоко оцениваем

+0

Да. Извините, я просто не мог понять, как! – NicolaiF

ответ

1

Возможно, я решил это частично, в зависимости от того, к чему вы стремитесь. Следующий код уменьшает массив arr до массива 1d с только соответствующими индексами. Вы можете сделать необходимые расчеты без учета нежелательных мест

arr = np.array([[0,9,9,0,0,9,9,1],[9,0,1,9,0,0,0,1]]) 
target = [1,9] # wanted values 
index = np.where(np.in1d(arr.ravel(), target).reshape(arr.shape)) 

no_zeros = arr[index] 

На этой стадии «все, что вам нужно», чтобы снова вставить значения «no_zeros» на массиве нулей с соответствующей формой, на индексах, приведенных в " индекс". Один из способов - сгладить индексный массив и пересчитать индексы, чтобы они соответствовали сглаженному массиву arr. Затем используйте numpy.insert (np.zeroes (arr.shape), new_index, no_zeroes), а затем после этого переформатируйте в соответствующую форму. Повторное изменение - это постоянное время в numpy. По общему признанию, я не вычислил быстрый способ numpy для создания массива new_index.

Надеюсь, это поможет.

Смежные вопросы