Числовое вычитание каждой пары элементов вектора

#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