Python `numpy.ufunc.outer`仅适用于某些轴

Python `numpy.ufunc.outer`仅适用于某些轴,python,arrays,numpy,Python,Arrays,Numpy,我在空间中有两个numpy 1D点数组,我想要一个2D数组,每个数组中的点之间的两两差。碰巧的是,如果空间是1D,那么我想要的是等价的 x,y = np.array([1,2,3,4]),np.array([3,4,5,6]) np.difference.outer(x,y) 对于Nd空间的差分,我该怎么做 In [118]: np.subtract.outer(x,y) Out[118]: array([[-2, -3, -4, -5], [-1, -2, -3, -4],

我在空间中有两个numpy 1D点数组,我想要一个2D数组,每个数组中的点之间的两两差。碰巧的是,如果空间是1D,那么我想要的是等价的

x,y = np.array([1,2,3,4]),np.array([3,4,5,6])
np.difference.outer(x,y)
对于Nd空间的差分,我该怎么做

In [118]: np.subtract.outer(x,y)
Out[118]: 
array([[-2, -3, -4, -5],
       [-1, -2, -3, -4],
       [ 0, -1, -2, -3],
       [ 1,  0, -1, -2]])
外部
操作可以通过
广播
进行复制:

In [120]: np.subtract(x[:,None],y)    # x[:,None]-y
Out[120]: 
array([[-2, -3, -4, -5],
       [-1, -2, -3, -4],
       [ 0, -1, -2, -3],
       [ 1,  0, -1, -2]])
这可以推广到更多维度。只要你遵守广播规则

由于广播的强大功能,我还没有尝试找出
ufunc.outer
在多维数组中的作用。对于一对1d阵列,其作用是显而易见的,并在文档中进行了简单说明

下面是一个关于
外部
如何组合轴的好例子:

In [132]: np.subtract.outer(np.ones((2,3)), np.ones((4,5))).shape
Out[132]: (2, 3, 4, 5)

它不接受轴参数,因此无法优化操作。总的来说,这不是一种有用的方法。

这里有一种使用3D矩阵的方法,可以在多个维度上工作

import numpy as np

N = 4 # number of vectors
p = 3 # vector dimensionality
x = np.arange(0, p * N).reshape((N, p))
y = np.arange(2, 2 + p * N).reshape((N, p))

Y = np.zeros((N, N, p))
Y[:] = y # setting rows
X = np.zeros((N, N, p))
X[:] = x
X = np.einsum("ijk->jik", X) # swap rows and columns
diff = np.subtract(X, Y) # reproduces 1D result with p = 0 and print(diff[:,:,0])

索引设置X矩阵的列可能比设置行然后进行特定转置更容易。

你能举一个Nd空格的例子吗?我的numpy没有
np.difference
函数。你的意思是减法吗?