您可以利用 complex
类型:
z = np.array([complex(c.m_x, c.m_y) for c in cells])
第一种解决方案
m, n = np.meshgrid(z, z)
out = abs(m-n)
第二种解决方案
网格生成是主要思路。但是numpy
很聪明,因此您不必生成m
和n
。只需使用z
的转置版本计算差异即可。网格会自动完成:
out = abs(z[..., np.newaxis] - z)
第三解决方案
如果直接将z
设置为一个二维数组,您可以使用z.T
而不是奇怪的z[..., np.newaxis]
。所以最终,您的代码将如下所示:
z = np.array([[complex(c.m_x, c.m_y) for c in cells]])
out = abs(z.T-z)
例子
>>> z = np.array([[0.+0.j, 2.+1.j, -1.+4.j]])
>>> abs(z.T-z)
array([[ 0. , 2.23606798, 4.12310563],
[ 2.23606798, 0. , 4.24264069],
[ 4.12310563, 4.24264069, 0. ]])
作为补充,您可能希望之后删除重复项,只选择上三角:
>>> np.triu(out)
array([[ 0. , 2.23606798, 4.12310563],
[ 0. , 0. , 4.24264069],
[ 0. , 0. , 0. ]])
一些基准测试
>>> timeit.timeit('abs(z.T-z)', setup='import numpy as np;z = np.array([[0.+0.j, 2.+1.j, -1.+4.j]])')
4.645645342274779
>>> timeit.timeit('abs(z[..., np.newaxis] - z)', setup='import numpy as np;z = np.array([0.+0.j, 2.+1.j, -1.+4.j])')
5.049334864854522
>>> timeit.timeit('m, n = np.meshgrid(z, z); abs(m-n)', setup='import numpy as np;z = np.array([0.+0.j, 2.+1.j, -1.+4.j])')
22.489568296184686
scipy
,请考虑使用scipy.spatial.distance_matrix
。 - Eric Gopak