python – Numpy:找到两个三维阵列之间的欧氏距离
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – Numpy:找到两个三维阵列之间的欧氏距离,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2041字,纯文字阅读大概需要3分钟。
内容图文
![python – Numpy:找到两个三维阵列之间的欧氏距离](/upload/InfoBanner/zyjiaocheng/810/e442171cb6dd49c19dbd78d559a3d1c0.jpg)
给定,两个维度的三维数组(2,2,2):
A = [[[ 0, 0],
[92, 92]],
[[ 0, 92],
[ 0, 92]]]
B = [[[ 0, 0],
[92, 0]],
[[ 0, 92],
[92, 92]]]
如何有效地找到A和B中每个向量的欧几里德距离?
我尝试了for-loops但这些都很慢,而且我正按照(>>>>>> 2,2)的顺序使用3-D数组.
最终我想要一个表格矩阵:
C = [[d1, d2],
[d3, d4]]
编辑:
我尝试过以下循环,但最大的问题是丢失了我想保留的尺寸.但距离是正确的.
[numpy.sqrt((A[row, col][0] - B[row, col][0])**2 + (B[row, col][1] -A[row, col][1])**2) for row in range(2) for col in range(2)]
解决方法:
以NumPy向量化思维方式思考,该方法将执行元素分化,沿最后一个轴进行平方和求和,最后得到平方根.因此,直接的实施将是 –
np.sqrt(((A - B)**2).sum(-1))
我们可以一次性使用np.einsum对最后一个轴进行平方和求和,从而使其效率更高,如此 –
subs = A - B
out = np.sqrt(np.einsum('ijk,ijk->ij',subs,subs))
numexpr module的另一种选择 –
import numexpr as ne
np.sqrt(ne.evaluate('sum((A-B)**2,2)'))
因为,我们在最后一个轴上使用长度为2的长度,我们可以将它们切片并将其馈送到评估方法.请注意,在evaluate字符串中无法进行切片.因此,修改后的实施将是 –
a0 = A[...,0]
a1 = A[...,1]
b0 = B[...,0]
b1 = B[...,1]
out = ne.evaluate('sqrt((a0-b0)**2 + (a1-b1)**2)')
运行时测试
功能定义 –
def sqrt_sum_sq_based(A,B):
return np.sqrt(((A - B)**2).sum(-1))
def einsum_based(A,B):
subs = A - B
return np.sqrt(np.einsum('ijk,ijk->ij',subs,subs))
def numexpr_based(A,B):
return np.sqrt(ne.evaluate('sum((A-B)**2,2)'))
def numexpr_based_with_slicing(A,B):
a0 = A[...,0]
a1 = A[...,1]
b0 = B[...,0]
b1 = B[...,1]
return ne.evaluate('sqrt((a0-b0)**2 + (a1-b1)**2)')
计时 –
In [288]: # Setup input arrays
...: dim = 2
...: N = 1000
...: A = np.random.rand(N,N,dim)
...: B = np.random.rand(N,N,dim)
...:
In [289]: %timeit sqrt_sum_sq_based(A,B)
10 loops, best of 3: 40.9 ms per loop
In [290]: %timeit einsum_based(A,B)
10 loops, best of 3: 22.9 ms per loop
In [291]: %timeit numexpr_based(A,B)
10 loops, best of 3: 18.7 ms per loop
In [292]: %timeit numexpr_based_with_slicing(A,B)
100 loops, best of 3: 8.23 ms per loop
In [293]: %timeit np.linalg.norm(A-B, axis=-1) #@dnalow's soln
10 loops, best of 3: 45 ms per loop
内容总结
以上是互联网集市为您收集整理的python – Numpy:找到两个三维阵列之间的欧氏距离全部内容,希望文章能够帮你解决python – Numpy:找到两个三维阵列之间的欧氏距离所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。