#python #numpy
Вопрос:
Учитывая массив numpy, скажем
x = np.array(
[[0],
[1],
[2]]
)
Я хотел бы найти матрицу, содержащую a-b
для каждой возможной пары a,b
в x
. Т. е.
[[0-0, 0-1, 0-2]
[1-0, 1-1, 1-2]
[2-0, 2-1, 2-2]]
==
[[ 0, -1, -2]
[ 1, 0, -1]
[ 2, 1, 0]]
Я избегаю использования for
цикла ради эффективности.
Комментарии:
1.
x - x.T
должно сработать.2. Как я об этом не подумал! Большое вам спасибо, @Michaelsczesny.
3.
np.subtract.outer
также, кажется, работает ( numpy.org/doc/stable/reference/generated/numpy.ufunc.outer.html )
Ответ №1:
Как писал Майкл, numpy broadcasting может помочь вам в этом. Если вы попытаетесь выполнить операцию над вектором a
с формой (3,1) с вектором b
с формой (1,3), numpy в разделе обрабатывает ее так, как если бы строки a
повторялись по столбцам, а столбцы b
, где повторение по строкам приводит к описанным вами операциям.
Вот почему Майкл сказал вам вычесть транспонирование первого вектора с самим собой, чтобы восстановить результат, который вы просили. x-x.T
Вещание хорошо, потому что оно достигает этого с шагом, и большую часть времени использует меньше памяти.
В более общем случае a
и b
не имеют одинаковой длины для того, чтобы это работало. Более подробная информация здесь: https://numpy.org/doc/stable/user/basics.broadcasting.html