Есть ли способ написать этот код более общий и элегантный? - PullRequest
1 голос
/ 02 февраля 2020

Я немного новичок ie в Python и хотел спросить, есть ли способ написать этот код более элегантным и общим:

array = np.linalg.norm(np.array([
   X-mu[0],
   X-mu[1],
   X-mu[2],
   X-mu[3],
   X-mu[4],
]), axis=2)

X - это RGB- Изображение (NxD, массив 300000x3), mu - матрица kxD (5x3). В конечном итоге массив должен представлять собой матрицу kxN или Nxk.

Есть ли способ для l oop над значениями mu вместо его ручного ввода?

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Вы пытаетесь выполнить операцию вычитания массива (3k, 3) и (5, 3). Чтобы иметь возможность уменьшить вторую ось для конечного результата (3k, 5) или (5, 3k), вам нужно, чтобы первые измерения передавались вместе. Это просто для широковещания, если вы вводите новую ось:

np.linalg.norm(X[:, None, :] - mu[None, ...], axis=-1)

ИЛИ

np.linalg.norm(X[None, ...] - mu[:, None, :], axis=-1)

None создает новую ось размера 1 в месте ее размещения в нижнем индексе. Многоточие (...) захватывает оставшиеся оси, поэтому вам не нужно явно писать :, :.

Разница в вышеприведенных выражениях передает в (3k, 5, 3) и (5, 3k, 3) соответственно. В обоих случаях norm уменьшает последнюю ось, оставляя первые два элемента фигуры. В зависимости от вашей памяти, любой подход может быть быстрее, иногда заметно. Вероятно, стоит провести тест, если это важно для вас.

0 голосов
/ 02 февраля 2020

Вы можете просто добавлять элементы с помощью для l oop, как это

array = []
for x in range(11):
    array += x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...