到方形整数晶格上的位置的距离

时间:2016-12-11 20:40:50

标签: python numpy scipy

我想计算一个整数点阵中每个其他位置的距离,从它的中心和每个距离的位置数。我目前正在使用以下代码来计算:

x = numpy.arange(-10, 11, 1)  
[X, Y] = numpy.meshgrid(x, x)  

R = numpy.sqrt(X**2+Y**2)  
R2 = numpy.ndarray.flatten(R)  
R3 = numpy.unique(R2)  
r = R3[1:] # excludes the 0  
Nr = numpy.zeros(numpy.size(r))  

for i in range(numpy.size(r)):  
    Nr[i] = numpy.count_nonzero(R2 == r[i]

这告诉我可能的距离是1,sqrt2,2,sqrt5等 它还告诉我他们是4x1,4xsqrt2,4x2,8xsqrt5等。

由于这是物理学中的常见问题,我想知道是否存在来自库的函数,例如numpy或scipy,它们可以更容易地返回这些值。

3 个答案:

答案 0 :(得分:1)

格子以(0,0)为中心。所以它在四个象限上是对称的。因此,我们可以使用此限制,因为我们可以计算一个象限所需的唯一距离和计数,并将这些计数乘以4来模拟所有四个象限。

所以,我们说我们使用的是第一个象限(右上角)。我们会跳过(y = 0)行上的元素,因为否则乘以4来模拟所有四个象限会导致重复结果。此外,通过这种方式,我们不必排除第一个元素,就像在原始帖子中所做的那样。

因此,实现将是 -

N = 11 # Lattice size
xa, ya = np.ogrid[0:N,1:N] # x's:0:N, y's:1:N 
unq_dists, count = np.unique(np.sqrt(xa**2 + ya**2), return_counts=1)
count = count*4

为了进一步提升性能,我们可以在平方求和上使用np.unique,然后在唯一值上使用np.sqrt。我们的想法是在较小的唯一集合上执行慢速平方根计算,如此 -

unq_dists, count = np.unique(xa**2 + ya**2, return_counts=1)
unq_dists = np.sqrt(unq_dists)

答案 1 :(得分:0)

在展平数组后,将其转换为Pandas Series并计算唯一值:

distances = pandas.Series(numpy.ndarray.flatten(R))
distances.value_counts()
# 9.219544     16
# 8.062258     16
# 5.000000     12
#10.000000     12
# 7.071068     12
# 2.236068      8
# ....

答案 2 :(得分:0)

您的代码可以通过几种方式提高效率。您首先形成两个大矩阵,然后对这些术语进行平方。最好先摆好姿势。此外,仅需要形成网格以执行外部添加:存在numpy.add.outer。最后,return_counts=True中的numpy.unique选项使您所拥有的循环变得不必要。 (顺便说一句,这样可以使阵列本身变平,所以你不必这样做。)所以代码缩短为三行

x = numpy.arange(-10, 11, 1)
R = numpy.sqrt(numpy.add.outer(x**2, x**2))
r, Nr = numpy.unique(R, return_counts=True)

(如果您想排除0距离,请返回r[1:]Nr[1:]