Давайте представим пустой массив NumPy 3x4, где у вас есть координата верхнего левого угла и размер шага в горизонтальном и вертикальном направлениях. Теперь я хотел бы знать координаты для середины каждой ячейки для всего массива. Как это:Оптимизация вложенного цикла for, который использует индексы массива для функции
Для этого я реализовал вложенную для цикла.
In [12]:
import numpy as np
# extent(topleft_x, stepsize_x, 0, topleft_y, 0, stepsize_y (negative since it's top-left)
extent = (5530000.0, 5000.0, 0.0, 807000.0, 0.0, -5000.0)
array = np.zeros([3,4],object)
cols = array.shape[0]
rows = array.shape[1]
# function to apply to each cell
def f(x,y):
return x*extent[1]+extent[0]+extent[1]/2, y*extent[5]+extent[3]+extent[5]/2
# nested for-loop
def nestloop(cols,rows):
for col in range(cols):
for row in range(rows):
array[col,row] = f(col,row)
In [13]:
%timeit nestloop(cols,rows)
100000 loops, best of 3: 17.4 µs per loop
In [14]:
array.T
Out[14]:
array([[(5532500.0, 804500.0), (5537500.0, 804500.0), (5542500.0, 804500.0)],
[(5532500.0, 799500.0), (5537500.0, 799500.0), (5542500.0, 799500.0)],
[(5532500.0, 794500.0), (5537500.0, 794500.0), (5542500.0, 794500.0)],
[(5532500.0, 789500.0), (5537500.0, 789500.0), (5542500.0, 789500.0)]], dtype=object)
Но как узнать, как я могу это оптимизировать? Я думал о векторизации или использовании лямбды. Я попытался его векторизовать следующим образом:
array[:,:] = np.vectorize(check)(cols,rows)
ValueError: could not broadcast input array from shape (2) into shape (3,4)
Но, чем я получил ошибку вещания. В настоящее время массив равен 3 на 4, но это также может стать 3000 на 4000.
Это довольно большое улучшение. Спасибо, что вы показали это – Mattijn