У меня есть два numpy массива R с размерами S x F и W с размерами N x M x F . Получение бетона позволяет присвоить следующие значения N = 5
, M = 7
, F = 3
, S = 4
Массив R содержит коллекции образцов S = 4
с F = 3
функциями , Каждая строка представляет образцы, а каждая строка - объект. Поэтому R[0]
- это первый образец, R[1]
- второй и продолжается. Каждая запись R[i-th]
содержит F
элементов, например, 1023 *.
Вот небольшой фрагмент для инициализации всех этих значений с учетом MWE
import numpy as np
# Size of Map (rows, columns)
N, M = 5, 7
# Number of features
F = 3
# Sample size
S = 4
np.random.seed(13)
R = np.random.randint(0, 10, size=(S, F))
W = np.random.randint(-4, 5, size=(N, M, F))
Мы также можем видеть заданную «линию глубины» numpy массив W , как вектор, также имеющий тот же размер, что и каждая строка массива R (это легко заметить, глядя на размер последнего измерения обоих массивов). С этим я могу получить доступ к W[2, 3]
и получить np.array([ 2, 2, -1 ])
(значения здесь только примеры).
Я создал простую функцию для вычисления расстояния данного вектора r до каждого «линия глубины» матрицы W и возврат положения ближайшего элемента W линии глубины в r
def nearest_vector_matrix_naive(r, W):
delta = np.zeros((N,M), dtype=int)
for i in range(N):
for j in range(M):
norm = 0
for k in range(F):
norm += (r[k] - W[i,j,k])**2
delta[i,j] = norm
norm = 0
win_idx = np.unravel_index(np.argmin(delta, axis=None), delta.shape)
return win_idx
Конечно, это очень наивный подход, который я мог бы дополнительно оптимизировать для приведенного ниже кода, получив ОГРОМНОЕ повышение производительности.
def nearest_vector_matrix(r, W):
delta = np.sum((W[:,:] - r)**2, axis=2)
return np.unravel_index(np.argmin(delta, axis=None), delta.shape)
Я могу использовать эту функцию просто как
nearest_idx = nearest_vector_matrix(R[0], W)
# Returns the nearest vector in W to R[0]
W[nearest_idx]
Поскольку у меня есть массив R с набором выборок, я использую следующий фрагмент для вычисления ближайших векторов к массиву выборок:
def nearest_samples_matrix(R, W):
DELTA = np.zeros((R.shape[0],2))
for idx, r in enumerate(R):
delta = np.sum((W[:,:] - r)**2, axis=2)
DELTA[idx] = np.unravel_index(np.argmin(delta, axis=None), delta.shape)
return DELTA
Эта функция возвращает массив с S строками ( S - количество выборок) двумерных индексов. То есть DELTA имеет (S, 2)
форму (всегда).
Я хотел бы знать, как я могу заменить for
l oop (например, для трансляции) внутри nearest_samples_matrix
для улучшения кода производительность исполнения еще дальше?
Я не мог понять, как это сделать. (кроме того, я смог сделать это в первом случае)