我有一个包含曲面的x,y,z坐标的大数据框。 我希望找到它们之间斜率最大的一对行(dz/sqrt(dx^2+dy^2))
maxGrad = 0
currentGrad = 0
height = 0
for i in range(len(df)):
for j in range(i+1,len(df)):
height = abs(df.z.iloc[j]-df.z.iloc[i])
distance = math.sqrt((df.x.iloc[j]-df.x.iloc[i])**2+(df.y.iloc[j]-df.y.iloc[i])**2)
currentGrad = height/distance
if currentGrad > maxGrad:
maxGrad = currentGrad
maxCoorPair = [df.x.iloc[i],df.y.iloc[i],df.x.iloc[j],df.y.iloc[j]]
print(maxGrad, maxCoorPair)
但是,由于嵌套的for循环,这不是很优雅,而且运行时间很长
我怎样才能做得更好
示例数据:
让我们定义一个函数,它取一个长度为n的向量,并返回一个nxnnumpy数组,其中行i和列j中的元素由向量中ith和jth元素的差给出
比如说
给予
像这样将此方法插入到公式中,一次对所有坐标对执行计算
slopes
看起来像这样注意,在公式中,未使用dz的绝对值。这是经过深思熟虑的,目的是不以形式“(a,b)和(b,a)”的答案结束
然后,我们可以使用
numpy.nanmax
计算数组的最大值,忽略nan
值,并使用numpy.where
提取与找到的最大值匹配的行和列然后我们可以把它们压缩成坐标的元组
这给了我们{}
所以最大斜率在第0行和第2行的坐标之间
这通常取决于问题的大小
让我们做一些调查
结论:
Numpy阵列比即使不使用Numpy函数也要快
numpy函数的使用仍在加速,但代价是:
调查
初始化
工具
解决方案
原始溶液
解决方案numpy1.0:将np数组替换为df
解决方案numpy1.1:idem numpy1.0并优化i坐标
解决方案numpy1.2;idem numpy1.1并优化j坐标
解决方案numpy2.0
莱利的回答
相关问题 更多 >
编程相关推荐