程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

How to elegantly preallocate a numpy array?

发布于2025-01-05 09:01     阅读(448)     评论(0)     点赞(28)     收藏(5)


This is mainly framed towards Numpy arrays but I feel it's a general design problem. In many cases I have the following generic problem in scientific computing: I have to read a dataset composed of several time instances of a certain vector field, e.g. the time-varying velocity field on a number of points. Something that could be a 3D array of sizes (Npoints, 3, Ntimesteps) (3 because I have three components of a vector). I normally would have one file per timestep, so I'd have to read Ntimesteps files, but I don't know beforehand the size of each field (i.e. I don't know Npoints beforehand, but it's the same for each file). If I want to preallocate the Numpy array to store this data, I got used to doing something along these lines:

tsteps = list(glob.glob('time*.csv'))
Nsteps = len(tsteps)
with open(tsteps[0], 'r') as f:
    # do my work to get Npoints and the data of the first file
    dataset = np.zeros(Npoints, 3, Nsteps)
    dataset[:,:,0] = data_first_file
for i,f in enumerate(tsteps[1:]):
    # do my work again
    dataset[:,:,i] = data_from_tstep_i

However, this does not look very 'elegant' since I have to write twice the code to process each timestep file: once to preallocate the array and once in the loop. Is there a more elegant pattern to do this?


解决方案


i think that there's no elegant way to do it if you don't know the shape in advance. but you should initiate it inside the loop for readability

tsteps = glob.glob('time*.csv') 
for i, filename in enumerate(tsteps):
    with open(filename) as f:
        data_i = np.loadtxt(f)
        if i==0:
            dataset = np.zeros(data_i.shape[0], 3, len(tsteps))
        dataset[:,:,i] = data_i


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/2046774/7ac30966d2498053fae3/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

28 0
收藏该文
已收藏

评论内容:(最多支持255个字符)