【发布时间】:2021-02-07 02:44:37
【问题描述】:
我尝试使用 Numpy 函数或向量而不是 for 循环来加速这段代码:
sommes = []
for j in range(vertices.shape[0]):
terme = new_vertices[j] - new_vertices[vertex_neighbors[j]]
somme_j = np.sum(terme)
sommes.append(somme_j)
E_int = np.sum(sommes)
(它是迭代算法的一部分,有很多“顶点”,所以我认为for循环太长了。)
例如,要在 j = 0 时计算“terme”,我有:
In: new_vertices[0]
Out: array([ 10.2533888 , -42.32279717, 68.27230793])
In: vertex_neighbors[0]
Out: [1280, 2, 1511, 511, 1727, 1887, 759, 509, 1023]
In: new_vertices[vertex_neighbors[0]]
Out: array([[ 10.47121043, -42.00123956, 68.218715 ],
[ 10.2533888 , -43.26905874, 62.59473849],
[ 10.69773735, -41.26464083, 68.09594854],
[ 10.37030712, -42.16729601, 68.24639107],
[ 10.12158146, -42.46624547, 68.29621598],
[ 9.81850836, -42.71158695, 68.33710623],
[ 9.97615447, -42.59625943, 68.31788497],
[ 10.37030712, -43.11676015, 62.54960623],
[ 10.55512696, -41.82622703, 68.18954624]])
In: new_vertices[0] - new_vertices[vertex_neighbors[0]]
Out: array([[-0.21782162, -0.32155761, 0.05359293],
[ 0. , 0.94626157, 5.67756944],
[-0.44434855, -1.05815634, 0.17635939],
[-0.11691832, -0.15550116, 0.02591686],
[ 0.13180734, 0.1434483 , -0.02390805],
[ 0.43488044, 0.38878979, -0.0647983 ],
[ 0.27723434, 0.27346227, -0.04557704],
[-0.11691832, 0.79396298, 5.7227017 ],
[-0.30173816, -0.49657014, 0.08276169]])
问题在于 new_vertices[vertex_neighbors[j]] 并不总是具有相同的大小。例如,当 j = 7 时:
In: new_vertices[7]
Out: array([ 10.74106112, -63.88592276, -70.15593947])
In: vertex_neighbors[7]
Out: [1546, 655, 306, 1879, 920, 925]
In: new_vertices[vertex_neighbors[7]]
Out: array([[ 9.71830698, -69.07323638, -83.10229623],
[ 10.71123017, -64.06983438, -70.09345104],
[ 9.74836003, -68.88820555, -83.16187474],
[ 10.78982867, -63.70552665, -70.2169896 ],
[ 9.74627177, -60.87823935, -60.13032811],
[ 9.79419242, -60.69528267, -60.182843 ]])
In: new_vertices[7] - new_vertices[vertex_neighbors[7]]
Out: array([[ 1.02275414, 5.18731363, 12.94635676],
[ 0.02983095, 0.18391163, -0.06248843],
[ 0.99270108, 5.0022828 , 13.00593527],
[ -0.04876756, -0.18039611, 0.06105013],
[ 0.99478934, -3.00768341, -10.02561137],
[ 0.94686869, -3.19064009, -9.97309648]])
没有for循环可以吗?我的想法已经用完了,所以任何帮助都将不胜感激!
谢谢。
【问题讨论】:
标签: python performance numpy loops vectorization