首先,对于在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])
答案 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
是通过复制方程式创建的布尔数组,以检查哪些坐标满足条件。target
是pp
的选择,将0轴上的所有元素都满足其他3轴上的条件(即selecting
为True)。请注意,target
是2D数组,要拥有1D数组,请使用target.flatten()
。