【发布时间】:2017-05-03 20:40:52
【问题描述】:
我的问题是关于我的代码的矢量化。我有一个包含 3D 坐标的数组和一个包含连接坐标的边信息的数组:
In [8]:coords
Out[8]:
array([[ 11.22727013, 24.72620964, 2.02986932],
[ 11.23895836, 24.67577744, 2.04130101],
[ 11.23624039, 24.63677788, 2.04096866],
[ 11.22516632, 24.5986824 , 2.04045677],
[ 11.21166992, 24.56095695, 2.03898215],
[ 11.20334721, 24.5227356 , 2.03556442],
[ 11.2064085 , 24.48479462, 2.03098583],
[ 11.22059727, 24.44837189, 2.02649784],
[ 11.24213409, 24.41513252, 2.01979685]])
In [13]:edges
Out[13]:
array([[0, 1],
[1, 2],
[2, 3],
[3, 4],
[4, 5],
[5, 6],
[6, 7],
[7, 8],], dtype=int32)
现在,我想计算边缘数组中坐标之间的欧几里得距离之和。例如。从 coords[0] 到 coords[1] 的距离 + 从 coords[1] 到 coords[2] 的距离.....
我有以下代码,可以完成这项工作:
def networkLength(coords, edges):
from scipy.spatial import distance
distancesNetwork = np.array([])
for i in range(edges.shape[0]):
distancesNetwork = np.append(distancesNetwork, distance.euclidean(coords[edges[i, 0]], coords[edges[i, 1]]))
return sum(distancesNetwork)
我想知道是否可以对代码进行矢量化,而不是循环。 pythonian的方法是什么?非常感谢!!
【问题讨论】:
-
1.将 import 语句放在任何模块开头以外的任何位置都被认为是一种非常糟糕的做法。从函数内部导入特别奇怪。 2. 在循环中添加 numpy 数组是非常低效的,因为它会导致许多重新分配,使得任何算法在最佳情况下有效 O(n^2)。
-
@EliKorvigo 1. 我不敢苟同:在函数中导入有助于打破循环依赖关系,或者拉入仅用于可选功能的大型包,以便从不使用这些功能的人可以使用模块而不需要大包。这是不寻常的,当然,但不是很糟糕的做法。只知道你为什么这样做。我同意这里可能没有必要。
-
@DavidZ 在我的实践中,当您想避免导入繁重的内容时,您可以简单地将函数放入包中的单独模块中。这也是解决循环导入问题的常用方法。
-
谢谢大家!反馈很有帮助!
标签: python numpy scipy vectorization euclidean-distance