Python `numpy.ufunc.outer`仅适用于某些轴
我在空间中有两个numpy 1D点数组,我想要一个2D数组,每个数组中的点之间的两两差。碰巧的是,如果空间是1D,那么我想要的是等价的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],
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
函数。你的意思是减法吗?