我想计算一个整数点阵中每个其他位置的距离,从它的中心和每个距离的位置数。我目前正在使用以下代码来计算:
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,它们可以更容易地返回这些值。
答案 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:]
)