【问题标题】:How can I get time efficent by creating an array with for loop?如何通过使用 for 循环创建数组来提高时间效率?
【发布时间】:2021-01-18 15:45:28
【问题描述】:

我在这个 for 循环中有一个范围为 2000 的 for 循环,我必须创建一个名为 Array 的数组 在另外两个数组中,我们称它们为 ArrayOfPositionSatellite,大小为 (3,38),另一个数组名为 ArrayOfPositionMassPoint,大小为 (38, 3, 4412)。 Array 的大小为 (38,3,4412),PositonOfSatellite 和 PointsOfMassPoint 的大小为 (3, )。我尝试用 for 循环覆盖 ArrayOfMassPoint :

ArrayOfPositionSatellite=  ArrayOfPositionSatellite.T  
Array = ArrayOfPositionMassPoint
for  i in range(38):
     for k  in range(4412):
            PositionOfSatellite =  ArrayOfPositionSatellite[:,i]
            PositionOfMassPoint=  ArrayOfPositionMassPoint[i,:,k]
            ElementOfA = -Gravitationalconstant* (PositionOfSatellite  - PositionOfMassPoint)/(np.linalg.norm( PositionOfSatellite - PositionOfMassPoint)**3)
            Array[i,:,k] = ElementOfArray

问题

我的问题是运行代码大约需要 3 个小时,而且时间太长。有什么方法可以提高时间效率吗?

如果有不清楚的地方,请发表评论,我会补充更多细节。

【问题讨论】:

标签: python arrays for-loop optimization time


【解决方案1】:

您可以矢量化您的计算。喜欢:

import numpy as np
ArrayOfPositionSatellite = np.random.randn(3, 38)
ArrayOfPositionMassPoint = np.random.randn(38, 3, 4412)
Gravitationalconstant = 6.67430e-11

# This is the difference vector
v = ArrayOfPositionMassPoint - ArrayOfPositionSatellite.T[:,:,None]
# This is norm of the difference vector
norm = np.linalg.norm(v, axis=1) ** 3
# This is normalized vector
norm_v = v / norm[:, None, :]
# This is the result
array = norm_v * -Gravitationalconstant
array.shape
>>> (38, 3, 4412)

这在我的机器上大约需要 40 毫秒,而不是 3 小时。

【讨论】:

  • 你能检查/比较你的结果吗?
  • 结果一致。计算也快得多。谢谢!!
猜你喜欢
  • 2017-03-05
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
相关资源
最近更新 更多