如何在使用append()时避免for循环

时间:2019-09-29 09:34:43

标签: python arrays python-3.x numpy for-loop

首先,对于在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])

1 个答案:

答案 0 :(得分:1)

由于条件涉及索引而不是4D数组的值,因此可以使用numpy.meshgrid将其向量化。

pp是您的4D数组:

iv, jv, kv = np.meshgrid(np.arange(pp.shape[3]), np.arange(pp.shape[2]), np.arange(pp.shape[1]))
selecting = np.round(np.sqrt((iv - np.round(pp.shape[3]/2))**2 + (jv - np.round(pp.shape[2]/2))**2)) == 2*kv
target = pp[:,selecting]

提供我已经正确理解了4D阵列的组织方式的信息:

  • meshgrid创建的数组保留索引以选择3个维度x,y,t上的pp个元素。
  • selecting是通过复制方程式创建的布尔数组,以检查哪些坐标满足条件。
  • targetpp的选择,将0轴上的所有元素都满足其他3轴上的条件(即selecting为True)。

请注意,target是2D数组,要拥有1D数组,请使用target.flatten()