Ускорьте программу, которая вычисляет среднее значение соседей в огромном массиве

У меня проблема со скоростью моей программы. Я хочу рассчитать среднее значение четырех соседей в огромном массиве. Вот часть моего кода. У вас есть идеи, как изменить последнюю строку? Или я должен использовать другой массив?

for a in np.arange(100000): for x in np.arange(size): for y in np.arange(size): if unchangeableflag[x*size+y] == 0: vnew[x*size+y] = (v[(x+1)*size+y] + v[(x-1)*size+y] + v[x*size+y+1] + v[x*size+y-1]) / 4.0 

3 Solutions collect form web for “Ускорьте программу, которая вычисляет среднее значение соседей в огромном массиве”

Вам вообще не понадобится петля. Предполагая, что v , vnew и unchangeableflag являются массивами 1- vnew size*size с size*size , вы можете сделать

 v = v.reshape(size, size) vnew = vnew.reshape(size, size) unchangeableflag = unchangeableflag.reshape(size, size) average = v[1:-1, 2:] average += v[1:-1, :-2] average += v[2:, 1:-1] average += v[-2:, 1:-1] average /= 4.0 vnew[1:-1, 1:-1][unchangeableflag[1:-1, 1:-1] == 0] = average 

Но чего вы на самом деле пытаетесь достичь? Это выглядит подозрительно, как будто вы можете уйти с некоторым применением дискретного лапласиана.

(Обратите внимание, что это предполагает, что v содержит числа с плавающей запятой. Если dtype ` dtype 'является типом целочисленного типа, вам нужна небольшая модификация.)

Вы должны использовать фильтр свертки SciPy или generic_filter . Это все еще вычислительно интенсивно, но быстрее, чем цикл. Обычно при выполнении этого типа усреднения также включается центральный элемент. Обратите внимание, что эти решения также применяются к многомерным массивам.

 from scipy import ndimage footprint = scipy.array([[0,0.25,0],[0.25,0,0.25],[0,0.25,0]]) filtered_array = scipy.convolve(array, footprint) 

ИЛИ

 from scipy import ndimage def myfunction(window): return (window[0,1] + window[1,0] + window[1,2] + window[2,1]) / 4 filtered_array = scipy.generic_filter(array, myfunction, size=3) 

Я не уверен, но вы можете удалить некоторый инвариант.

 for a in np.arange(100000): for x in np.arange(size): for y in np.arange(size): t = x*size+y if unchangeableflag[t] == 0: vnew[t] = (v[t+size] + v[t-size] + v[t+1] + v[t-1]) / 4.0 
  • Как создать произвольную ортонормированную матрицу в python numpy
  • Использование Numpy с pypy
  • массив numpy, который равен (n, 1) и (n,)
  • выборка случайных поплавков в диапазоне в numpy
  • Использование Cython для переноса шаблона c ++ для принятия любого массива numpy
  • Принудительное преобразование нечисловых массивов numpy с заменой NAN
  • Существует многомерная версия arange / linspace в numpy?
  • Обработка очень больших файлов netCDF на python
  • Как вычислить стандартную ошибку из результатов ODR?
  • Numpy.putmask с изображениями
  • Cython prange медленнее для 4 нитей, затем с диапазоном
  • Python - лучший язык программирования в мире.