ось в numpy .ufun c .outer - PullRequest
       0

ось в numpy .ufun c .outer

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

numpy.ufunc.outer похоже на Mathematica Outer[], но я не могу понять, как трактовать двумерный массив как одномерный массив одномерных массивов. То есть, предположим, a = [[1, 2], [3, 4]] и b = [[4, 5], [6, 7]]. Я хочу вычислить двумерный массив, чей ij -й элемент является расстоянием (как я его определяю) между i-й строкой a и j-й строкой b, поэтому в этом случае, если мы используем supnorm расстояние, результат будет [[3, 5], [1, 3]]. Очевидно, что можно написать al oop, но это кажется морально неправильным, и именно то, что ufunc.outer призвано избегать.

1 Ответ

1 голос
/ 02 апреля 2020
In [309]: a = np.array([[1, 2], [3, 4]]); b = np.array([[4, 5], [6, 7]])    

С помощью broadcasting мы можем взять различия строк:

In [310]: a[:,None,:]-b[None,:,:]                                                              
Out[310]: 
array([[[-3, -3],
        [-5, -5]],

       [[-1, -1],
        [-3, -3]]])

и уменьшить значения с максимальным / абсолютным значением на последней оси (я думаю, это то, что вы подразумеваете под sup norm :

In [311]: np.abs(a[:,None,:]-b[None,:,:]).max(axis=-1)                                         
Out[311]: 
array([[3, 5],
       [1, 3]])

При subtract.outer мне нужно выбрать подмножество результатов и затем транспонировать:

In [318]: np.subtract.outer(a,b)[:,[0,1],:,[0,1]].transpose(2,1,0)                             
Out[318]: 
array([[[-3, -3],
        [-1, -1]],

       [[-5, -5],
        [-3, -3]]])

Я не вижу элементов управления axis в outer документы. Поскольку широковещание дает более точное управление, я не видел особого применения функции ufunc.outer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...