【问题标题】:For loop to iterate the operationFor循环迭代操作
【发布时间】:2019-08-20 15:26:50
【问题描述】:
import numpy as np
import pandas as pd
from scipy.spatial.distance import directed_hausdorff

df:

1       1.1     2       2.1     3       3.1     4       4.1

45.13   7.98    45.10   7.75    45.16   7.73    NaN     NaN
45.35   7.29    45.05   7.68    45.03   7.96    45.05   7.65

一对情侣的计算距离

x = df['3']
y = df['3.1']
P = np.array([x, y])

q = df['4']
w = df['4.1']
Q = np.array([q, w])

Q_final = list(zip(Q[0], Q[1]))
P_final = list(zip(P[0], P[1]))

directed_hausdorff(P_final, Q_final)[0]

期望的输出:

整个数据集的 for 循环过程相同

distance from a['0'], a['0']is 0
from a['0'], a['1'] is 0.234 (some number)
from a['0'], a['2'] is .. ...

[0] 到所有,然后到[1] 到所有等等。 最后我应该得到一个对角线有0s`的矩阵

我试过了:

space = list(df.index)

dist = []
for j in space:
    for k in space:
         if k != j:
             dist.append((j, k, directed_hausdorff(P_final, Q_final)[0]))

但是在[3][4] 之间获得相同的距离值

【问题讨论】:

  • 所以你的 Q/P 值总是使用 n 和 n + 0.1 的数组计算,然后你计算的距离是 x 和 x + 1?

标签: python pandas loops for-loop


【解决方案1】:

我不完全确定您要做什么.. 但根据您计算第一个的方式,这是一个可能的解决方案:

import pandas as pd
import numpy as np
from scipy.spatial.distance import directed_hausdorff

df = pd.read_csv('something.csv')

groupby = lambda l, n: [tuple(l[i:i+n]) for i in range(0, len(l), n)]
values = groupby(df.columns.values, 2)

matrix = np.zeros((4, 4))

for Ps in values:
    x = df[str(Ps[0])]
    y = df[str(Ps[1])]
    P = np.array([x, y])
    for Qs in values:
        q = df[str(Qs[0])]
        w = df[str(Qs[1])]
        Q = np.array([q, w])
        Q_final = list(zip(Q[0], Q[1]))
        P_final = list(zip(P[0], P[1]))
        matrix[values.index(Ps), values.index(Qs)] = directed_hausdorff(P_final, Q_final)[0]
print(matrix)

输出:

[[0.         0.49203658 0.47927028 0.46861498]
 [0.31048349 0.         0.12083046 0.1118034 ]
 [0.25179357 0.22135944 0.         0.31064449]
 [0.33955854 0.03       0.13601471 0.        ]]

【讨论】:

  • 似乎工作,但为什么矩阵的大小是 4 到 4?即使 Im changing the size to 1000x1000 Im 仍然获得 4x4 值
  • 你有 8 个值。然后,您将它们成对分组为数组,这意味着您有 4 个数组。然后你穿过数组,所以 4 x 4
猜你喜欢
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多