Вы пытаетесь выполнить операцию вычитания массива (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
уменьшает последнюю ось, оставляя первые два элемента фигуры. В зависимости от вашей памяти, любой подход может быть быстрее, иногда заметно. Вероятно, стоит провести тест, если это важно для вас.