Каков самый быстрый способ перебора всех элементов в массиве 3D NumPy? Если array.shape = (r,c,z)
, должно быть что-то быстрее, чем это:Итерация по многомерному массиву Numpy
x = np.asarray(range(12)).reshape((1,4,3))
#function that sums nearest neighbor values
x = np.asarray(range(12)).reshape((1, 4,3))
#e is my element location, d is the distance
def nn(arr, e, d=1):
d = e[0]
r = e[1]
c = e[2]
return sum(arr[d,r-1,c-1:c+2]) + sum(arr[d,r+1, c-1:c+2]) + sum(arr[d,r,c-1]) + sum(arr[d,r,c+1])
Вместо создания вложенной for
петлю, как показано ниже, чтобы создать свои ценности из e
, чтобы запустить функцию nn
для каждого пикселя:
for dim in range(z):
for row in range(r):
for col in range(c):
e = (dim, row, col)
Я хотел бы оцифровать мою функцию nn
таким образом, чтобы извлекать информацию о местоположении для каждого элемента (например, e = (0,1,1)
) и итерации по всем элементам в моей матрице без необходимости вручную вводить каждое локальное значение e
ИЛИ создание беспорядочного вложенного цикла. Я не уверен, как применить np.vectorize
к этой проблеме. Благодаря!
Не должно быть 'array [dim, row, col] = someValue' вместо этого? Вы присваиваете одинаковое значение 'someValue' всем его элементам? Подумайте о том, как вводить образец ввода, чтобы узнать, что вы имеете в виду? – Divakar
Кроме того, в NumPy самый быстрый способ - * не * итерировать вообще, но выполнять операции векторизованным образом. Можете ли вы это сделать или нет, будет зависеть от самой предполагаемой операции, которую вы хотели бы выполнять в каждой итерации. – Divakar
Спасибо за изменения! Теперь, для * правильной * векторизации и, следовательно, заметного ускорения, фактическая реализация 'nn' должна быть известна. В общем случае можно было бы изучить ['numpy.vectorize'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html). – Divakar