【问题标题】:How to append and pair coordinate values in nested for loop如何在嵌套的 for 循环中附加和配对坐标值
【发布时间】:2022-11-18 03:38:15
【问题描述】:

我找到两对随机点之间的距离,然后以 3 x 3 模式复制这些点,以便在一定距离后看到相同的点,这是通过嵌套 for 循环完成的。我试图从 for 循环中找到新创建的点之间的距离。

我尝试在循环中使用 append 来存储点,这给了我距离,但它只给了我 24 个距离,而 4 个点的 9 个副本之间应该有更多的距离。

我是否没有实施追加校正来考虑额外的距离?

代码

import numpy as np
import matplotlib.pyplot as plt
import random
import math

dist = []

#scale of the plot
scalevalue = 10

x = [random.uniform(1, 10) for n in range(4)]
y = [random.uniform(1, 10) for n in range(4)]

tiles = np.linspace(-scalevalue, scalevalue, 3)
for i in tiles:
    for j in tiles:
        bg_tile = plt.scatter(x + i,y + j, c="black", s=3)
        dist.append(i)
        dist.append(j)
        pairs = list(zip(x + i,y + j))
        
plt.show()

def distance(x, y):
    return math.sqrt((x[0]-x[1])**2 + (y[0]-y[1])**2)

for i in range(len(pairs)):
    for j in range(i+1,len(pairs)):
        dist.append(distance(pairs[i],pairs[j]))

print(dist)

【问题讨论】:

  • 我看到 xy 是普通列表,而你正在做 x + i 所以我预计那里会出现错误,而不是在 dist.append(i) 行,你实际看到的输出是什么?
  • 我假设我看到了 3x3 图案的每个中心点的位置之间的距离。我得到 [-10.0, -10.0, -10.0, 0.0, -10.0, 10.0, 0.0, -10.0, 0.0, 0.0, 0.0, 10.0, 10.0, -10.0, 10.0, 0.0, 10.0, 10.0, 0.5490723814252758, 1.5985711880070652, 3.2443215556507923, 1.6263661505494527, 3.258106715408061, 3.5873679393211675],其中最后四个值是中心四个点之间的距离,其他值是图的比例 (scalevalue) 的距离。

标签: python numpy append distance


【解决方案1】:

运行你的代码:

x(和y)是数字列表 (4):

In [553]: x
Out[553]: [8.699962201099193, 3.1643082386096975, 5.245385542599207, 3.0412506367299033]

tiles 是一个数组:

In [554]: tiles
Out[554]: array([-10.,   0.,  10.])

第一次迭代 - 没有情节,并且做一个 (i,j) 追加,而不是顺序的。这更好地将 i 值与 j 值分开:

In [558]: dist=[]
     ...: for i in tiles:
     ...:     for j in tiles:
     ...:         dist.append((i,j))
     ...:         pairs = list(zip(x + i,y + j))

In [559]: dist
Out[559]: 
[(-10.0, -10.0),       # that just reflects how you iterate on tiles
 (-10.0, 0.0),
 (-10.0, 10.0),
 (0.0, -10.0),
 (0.0, 0.0),
 (0.0, 10.0),
 (10.0, -10.0),
 (10.0, 0.0),
 (10.0, 10.0)]

您在评论中显示的平面列表混淆了这些值。你为什么做这个?

pairs 以最后一个 i,j 值结束;早期的迭代被丢弃。

In [560]: pairs
Out[560]: 
[(18.699962201099193, 18.63063210113664),
 (13.164308238609697, 12.329695190243902),
 (15.245385542599207, 16.685778921185936),
 (13.041250636729902, 15.89730196643608)]

所以第一列是:

In [561]: i
Out[561]: 10.0
In [562]: x+i
Out[562]: array([18.6999622 , 13.16430824, 15.24538554, 13.04125064])

x是一个list,但是inp.float64,所以加法是数组加法(list 'addition'是join)。

最后一个pairs

In [567]: alist = []
     ...: for i in range(len(pairs)):
     ...:     for j in range(i+1,len(pairs)):
     ...:         alist.append(distance(pairs[i],pairs[j]))
     ...:         

In [568]: alist
Out[568]: 
[0.8374876734992962,
 1.442060937629651,
 2.8568926932380996,
 1.664725810930718,
 2.9755013255616056,
 3.1987125977481807]

迭代所做的是获得这 4 对的 6 种组合

In [574]: distance(pairs[0],pairs[1])
Out[574]: 0.8374876734992962

这 6 个值(在我的例子中不同,因为随机数不同)与您之前在 dist 中累积的 tile 值无关。

如果我从pairs 制作一个二维数组:

In [575]: arr = np.array(pairs); arr
Out[575]: 
array([[18.6999622 , 18.6306321 ],
       [13.16430824, 12.32969519],
       [15.24538554, 16.68577892],
       [13.04125064, 15.89730197]])

我可以复制distance

In [576]: (arr[:,1]-arr[:,0])**2
Out[576]: array([4.80666276e-03, 6.96578941e-01, 2.07473309e+00, 8.15702920e+00])

In [577]: np.sqrt(np.sum(_[:2]))
Out[577]: 0.8374876734992962

我不知道这有什么意义。 pairs 只是 x,y 值加上 10

In [579]: np.column_stack((x,y))+10
Out[579]: 
array([[18.6999622 , 18.6306321 ],
       [13.16430824, 12.32969519],
       [15.24538554, 16.68577892],
       [13.04125064, 15.89730197]])

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 2021-12-15
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 2020-07-02
    • 2016-11-10
    相关资源
    最近更新 更多