您可以利用以下
complex类型:
# build a complex array of your cellsz = np.array([complex(c.m_x, c.m_y) for c in cells])
第一个解决方案
# mesh this array so that you will have all combinationsm, n = np.meshgrid(z, z)# get the distance via the normout = abs(m-n)
第二解决方案
网格划分是主要思想。但它
numpy很聪明,因此您不必生成
m&
n。只需使用的转置版本计算差异即可
z。网格自动完成:
out = abs(z[..., np.newaxis] - z)
第三种解决方案
如果
z直接设置为二维数组,则可以使用
z.T而不是weird
z[..., np.newaxis]。所以最后,您的代码将如下所示:
z = np.array([[complex(c.m_x, c.m_y) for c in cells]]) # notice the [[ ... ]]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


