У меня есть массив 3D numpy, такой как a = np.zeros((100,100, 20))
. Я хочу выполнить операцию над каждой позицией x,y
, которая включает в себя все элементы над осью z
, и результат сохраняется в массиве, таком как b = np.zeros((100,100))
, на той же соответствующей позиции x,y
.Как векторизовать массивы 3D Numpy
Теперь я делаю это с помощью для цикла:
d_n = np.array([...]) # a parameter with the same shape as b
for (x,y), v in np.ndenumerate(b):
C = a[x,y,:]
### calculate some_value using C
minv = sys.maxint
depth = -1
C = a[x,y,:]
for d in range(len(C)):
e = 2.5 * float(math.pow(d_n[x,y] - d, 2)) + C[d] * 0.05
if e < minv:
minv = e
depth = d
some_value = depth
if depth == -1:
some_value = len(C) - 1
###
b[x,y] = some_value
Сейчас проблема заключается в том, что эта операция гораздо медленнее, чем другие выполнявший вещий путь, например c = b * b
(я на самом деле профилированный эта функцию, и это примерно на 2 порядка медленнее, чем другие, использующих NumPy встроенных функций и векторизованных функции, по сравнению с аналогичным числом элементов)
Как я могу улучшить производительность такого рода функции, отображающие 3D-массив для двумерного?
Что такое 'd_n' в вашем коде? – Jaime
Это просто параметр с той же формой, что и 'b', только что отредактированный пример – Xocoatzin