使用 3d 数组索引 4d 数组
Usind 3d array to index 4d array
我有一个尺寸为 I[t, z, y, x]
的 4d-xarray 和一个尺寸为 Z[t, y, x]
的 3d-xarray。 Z
是我在 I
中需要的维度 z 的索引。现在我想获取值 I[t, Z[t,y,x], y, x]
并将它们写入大小为 O[t, y, x]
.
的新 xarray
原则上我通过使用 for 循环解决了这个问题,但是那太慢了(很多和大数组)。有没有不用 for 循环的方法?
示例代码执行我想要的但速度较慢:
def get_field_at_levels(array, levels):
shape = array.shape
array_out = np.zeros_like(levels)
for t in range(shape[0]):
for x in range(shape[2]):
for y in range(shape[3]):
if np.isnan(levels[t, x, y]):
array_out[t, x, y]==float('nan')
else:
array_out[t, x, y] = array[t, int(levels[t, x, y]), x, y]
return array_out
我使用 numpy.asarray 将所有 xarray 转换为 numpy.arrays。现在程序使用循环已经足够快了。下面是一个使用随机数的示例脚本。
在我的实际数据中,我的索引超出范围 (-1)。在这种情况下,我想要 NaN 作为结果。
import numpy as np
import time
tsize = 1
xsize = 40
ysize = 240
zsize = 260
def val_at_lev(data, Ind):
sh=data.shape
data2=np.empty([sh[0],sh[1]+1,sh[2],sh[3]])
data2[:,0:sh[1],:,:]=data
data2[:,sh[1],:,:]='nan'
out=np.asarray(np.zeros_like(Ind))
erg=np.asarray([data2[t,Ind[t,0,j,k],j,k] for t in range(sh[0]) for j in range(sh[2]) for k in range(sh[3])])
out = erg.reshape(tsize,1,ysize,zsize)
return out
# Main program
Ind=np.random.randint(-1,xsize,[tsize,1,ysize,zsize])
data=np.random.uniform(0,100,[tsize,xsize,ysize,zsize])
start_time = time.time()
erg=val_at_lev(data,Ind)
print("--- %s seconds ---" % (time.time() - start_time))
我有一个尺寸为 I[t, z, y, x]
的 4d-xarray 和一个尺寸为 Z[t, y, x]
的 3d-xarray。 Z
是我在 I
中需要的维度 z 的索引。现在我想获取值 I[t, Z[t,y,x], y, x]
并将它们写入大小为 O[t, y, x]
.
原则上我通过使用 for 循环解决了这个问题,但是那太慢了(很多和大数组)。有没有不用 for 循环的方法?
示例代码执行我想要的但速度较慢:
def get_field_at_levels(array, levels):
shape = array.shape
array_out = np.zeros_like(levels)
for t in range(shape[0]):
for x in range(shape[2]):
for y in range(shape[3]):
if np.isnan(levels[t, x, y]):
array_out[t, x, y]==float('nan')
else:
array_out[t, x, y] = array[t, int(levels[t, x, y]), x, y]
return array_out
我使用 numpy.asarray 将所有 xarray 转换为 numpy.arrays。现在程序使用循环已经足够快了。下面是一个使用随机数的示例脚本。 在我的实际数据中,我的索引超出范围 (-1)。在这种情况下,我想要 NaN 作为结果。
import numpy as np
import time
tsize = 1
xsize = 40
ysize = 240
zsize = 260
def val_at_lev(data, Ind):
sh=data.shape
data2=np.empty([sh[0],sh[1]+1,sh[2],sh[3]])
data2[:,0:sh[1],:,:]=data
data2[:,sh[1],:,:]='nan'
out=np.asarray(np.zeros_like(Ind))
erg=np.asarray([data2[t,Ind[t,0,j,k],j,k] for t in range(sh[0]) for j in range(sh[2]) for k in range(sh[3])])
out = erg.reshape(tsize,1,ysize,zsize)
return out
# Main program
Ind=np.random.randint(-1,xsize,[tsize,1,ysize,zsize])
data=np.random.uniform(0,100,[tsize,xsize,ysize,zsize])
start_time = time.time()
erg=val_at_lev(data,Ind)
print("--- %s seconds ---" % (time.time() - start_time))