首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用3d数组来索引4d数组

使用3d数组来索引4d数组
EN

Stack Overflow用户
提问于 2019-06-05 19:52:32
回答 1查看 180关注 0票数 2

我有一个维度为I[t, z, y, x]的4d-xarray和一个维度为Z[t, y, x]的3d-xarray。对于I中的维度z,Z是我需要的索引。现在我想获取值I[t, Z[t,y,x], y, x]并将它们写入一个新的大小为O[t, y, x]的xarray中。

在原则上,我通过使用for循环解决了这个问题,但这太慢了(大量的大型数组)。有没有办法在没有for循环的情况下做到这一点?

示例代码做了我想做的事情,但速度很慢:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

回答已采纳

发布于 2019-06-06 21:17:31

我使用numpy.asarray将所有的xarray转换为numpy.arrays。现在程序使用循环已经足够快了。下面是一个使用随机数的示例脚本。在我的实际数据中,我的索引超出了范围(-1)。在本例中,我想要NaN作为结果。

代码语言:javascript
运行
复制
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))
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56459969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档