gpt4 book ai didi

python - Python 中 3D 点数组的欧氏距离

转载 作者:行者123 更新时间:2023-12-05 05:30:58 25 4
gpt4 key购买 nike

我有两个 3D 点(数字坐标数据)和相关属性数据(字符串 + 数字)的 .csv 文件。我需要计算每个点与其他每个点之间的欧氏距离,并维护与差异关联的每个点的属性数据。我有一个适用于此的方法,但它使用了一个循环,我希望有一种更好的方法来执行此操作,它占用的资源更少。这是我目前使用的代码:

import pandas as pd
import numpy as np

# read .csv
dataset_1 = pd.read_csv(dataset1 path)
dataset_2 = pd.read_csv(dataset2 path)

# convert to numpy array
array_1 = dataset_1.to_numpy()
array_2 = dataset_2.to_numpy()

# define data types for new array. This includes the attribute data I want to maintain
data_type = np.dtype('f4, f4, f4, U10, U10, f4, f4, f4, U10, U10, U10, f4, f4, U10, U100')

#define the new array
new_array = np.empty((len(array_1)*len(array_2)), dtype=data_type)

#calculate the Euclidean distance between each set of 3D coordinates, and populate the new array with the results as well as data from the input arrays
number3 = 0
for number in range(len(array_1)):
for number2 in range(len(array_2)):
Euclidean_Dist = np.linalg.norm(array_1[number, 0:3]-array_2[number2, 0:3])
new_array[number3] = (array_1[number, 0], array_1[number, 1], array_1[number, 2], array_1[number, 3], array_1[number, 7],
array_2[number2, 0], array_2[number2, 1],array_2[number2, 2], array_2[number2, 3], array_2[number2, 6], array_2[number2, 7],
array_2[number2, 12], array_2[number2, 13], dist,''.join(sorted((str(array_2[number2, 0]) + str(array_2[number2, 1]) + str(array_2[number2, 2]) + str(array_2[number2, 3])))))
number3+=1

#Convert results to pandas dataframe
new_df = pd.DataFrame(new_array)

我处理非常大的数据集,所以如果有人能提出更有效的方法来做到这一点,我将不胜感激。

谢谢,

上面提供的代码适用于我的问题,但我正在寻找提高效率的方法

编辑以显示示例输入数据集 (dataset_1 & dataset_2) 和所需的输出数据集 (new_df)。关键是对于输出数据集,我需要维护与欧几里得距离相关联的输入数据集的属性。我可以使用 scipy.spatial.distance.cdist 来计算距离,但我不确定在输出数据中维护输入数据属性的最佳方法。

enter image description here

最佳答案

两种方法。设置:

import numpy as np
import pandas as pd
import string
from scipy.spatial.distance import cdist

upper = list(string.ascii_uppercase)
lower = list(string.ascii_lowercase)

df1 = pd.DataFrame(np.random.rand(26,3),
columns = lower[-3:],
index = lower )

df2 = pd.DataFrame(np.random.rand(25,3),
columns = lower[-3:],
index = upper[:-1] ) #testing different lengths

使用 .merge(*, how='cross'),这会给出我认为的预期输出

new_df = df1.reset_index().merge(df2.reset_index(), 
how = 'cross',
suffixes = ['1', '2'])
new_df['dist'] = cdist(df1, df2).flatten()

将原始数据维护为 MultiIndexes 的 2D“ravelled”方法:

new_df2 = pd.DataFrame(cdist(df1, df2), 
index = pd.MultiIndex.from_arrays(df1.reset_index().values.T,
names = df1.reset_index().columns),
columns = pd.MultiIndex.from_arrays(df2.reset_index().values.T,
names = df2.reset_index().columns))

关于python - Python 中 3D 点数组的欧氏距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74486648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com