- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个 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 来计算距离,但我不确定在输出数据中维护输入数据属性的最佳方法。
最佳答案
两种方法。设置:
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()
将原始数据维护为 MultiIndex
es 的 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/
我有一个问题需要分而治之解决。有一个包含 N 个点的集合 S。如果有一个平行于轴的正方形,只包含S中的两个点p1和p2,则我们称p1和p2为 friend 点。 现在,我需要使用分而治之算法来计算 S
为 iPad 编程时,字体(和其他)大小以“磅”为单位指定。我已经看到将点作为独立于屏幕分辨率的像素的引用。但是我无法确定一个点的实际大小(即以英寸为单位)。一个点是否等于标准 iPad 屏幕上的一个
我有一个来自 Hadley Wickham 的 ggplot2 书中的问题。 我在这里有这个数据框: class % group_by(class) %>% summarise(n = n
好的,这是一些代码( pdfDocument 是 com.itextpdf.text.Document ): PdfPTable table = new PdfPTable(1); PdfPCell
我正在尝试添加一个 if 语句,如果小于 17,则将另一张牌添加到 DealerHand 中。 目前,它只是记录: 7 19 [ { suit: '♦', value: 9, points: 9 },
我正在编写一个程序,我需要: 对图像的每个像素进行测试 如果测试结果为真,我必须向点云中添加一个点 如果测试结果为假,什么都不做 我已经在 CPU 端 C++ 上编写了一个工作代码。现在我需要使用 C
我是一名优秀的程序员,十分优秀!