【发布时间】:2019-09-29 09:34:43
【问题描述】:
首先,我很抱歉我是 python 和 numpy 的绝对初学者。请原谅我的无知。
我有一个 4D 压力测量立方体,其维度是(样本数、时间、y 轴、x 轴),这意味着对于每个样本,我都有一个时空分布的 3D 立方体。我需要收集这个 3D 立方体的压力读数(时间、y 轴、x 轴)并将其存储到每个样本的数组中,仅在坐标满足特定条件的情况下。在改变特定条件时,该数组的大小也会发生变化。所以,我必须使用 append() 来构建这个数组。但是,由于对于 1000 个样本,我必须使用 For-Loop 为每个样本搜索超过一百万个坐标,我编写的代码效率非常低,并且需要大量时间来运行(超过几个小时)。你能帮我写得更有效率吗?
以下是我尝试解决问题的代码。它工作得很好并给出了预期的结果,但它非常慢。
import numpy as np
# Number of sample points in x,y and t-axis
Nx = 101
Ny = 101
Nt = 100
n_train = 1000
target_array = []
for i_train in range (n_train):
for k in range (Nt):
for j in range (Ny):
for i in range (Nx):
if np.round(np.sqrt((i-np.round(Nx/2))**2+(j-np.round(Ny/2))**2)) == 2*k:
target_array.append(Pressure[i_train,k,j,i])
【问题讨论】:
-
它如何运作良好?您在外部循环中覆盖了 target_array,因此最后它将只包含与
i_train = 999对应的值。 -
非常抱歉这个错误,我从我的文件中复制代码时出错了。我已经纠正了。非常感谢您指出这一点。
-
首先,您可以尝试在(内部)循环之外提取所有可能的(例如
np.round(Nx/2))操作。这将为您带来一些时间改进,但最大因子为 10。然后您可以使用矢量化操作(np 特定)将时间减少到几秒钟(可能)。 -
非常感谢您的建议。我为我的无知道歉,但您能否详细解释一下这句话:“那么您可以使用向量化操作(特定于 np)将时间减少到几秒钟(可能)”?
-
@CristiFati 的意思是,您应该尝试使用 numpy 数组的内置功能来执行矢量化操作,而不是依赖 Python 的 for 循环,后者的性能极差。我会尝试为您制定一个解决方案。
标签: python arrays python-3.x numpy for-loop