python中的“outer”类似于Mathematica

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (180)

我有一些粒子的2D位置(x,y)。在Mathematica中,我可以使用 Outer[Subtract, pos, pos, 1] If pos是一个形状数组,(n,2)其中n是粒子数,上面的Mathematia代码的结果是一个n x n x 2数组,并且该矩阵的每个[i,j]元素都是(x_i - x_j, y_i - y_j)操作的结果。

例如

pos = {{x1, y1}, {x2, y2}, {x3, y3}};
Outer[Subtract, pos, pos, 1]

{
 {{0, 0}, {x1 - x2, y1 - y2}, {x1 - x3, y1 - y3}}
 ,
 {{-x1 + x2, -y1 + y2}, {0, 0}, {x2 - x3, y2 - y3}}
 ,
 {{-x1 + x3, -y1 + y3}, {-x2 + x3, -y2 + y3}, {0, 0}}
}

这是一个3x3x2阵列。但是,在python中我无法得到类似的结果:

import numpy as np
pos = [[1, 2], [5, 6], [8, 9]]
print (np.subtract.outer(pos, pos).shape)

给予(3, 2, 3, 2)np.subtract.outer(pos, pos)

array([[[[ 0, -1],
     [-4, -5],
     [-7, -8]],

    [[ 1,  0],
     [-3, -4],
     [-6, -7]]],


   [[[ 4,  3],
     [ 0, -1],
     [-3, -4]],

    [[ 5,  4],
     [ 1,  0],
     [-2, -3]]],


   [[[ 7,  6],
     [ 3,  2],
     [ 0, -1]],

    [[ 8,  7],
     [ 4,  3],
     [ 1,  0]]]])

而对于类似的值,Mathemtica代码给出了我需要的东西,即

{
{{0, 0}, {-4, -4}, {-7, -7}}
,
{{4, 4}, {0, 0}, {-3, -3}}
, 
{{7, 7}, {3, 3}, {0, 0}}
}
提问于
用户回答回答于

您正在寻找:

pos = np.array(pos)

pos[:,None]-pos

您也可以通过以下方式实现相同目标

np.squeeze([i-pos for i in pos]) 
用户回答回答于

numpy.ufunc.outer(a,b)将使用一个元素a和另一个元素计算每个可能的组合b。一种选择是分别计算x和y坐标,然后重新合并result

pos = np.array([[1, 2], [5, 7], [8, 13]])
dx = np.subtract.outer(pos[:,0],pos[:,0])
dy = np.subtract.outer(pos[:,1],pos[:,1])
result=np.transpose([dx,dy], axes=(1,2,0))

(我更改了值,pos使结果不那么对称。)

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动