【发布时间】:2014-07-18 23:42:41
【问题描述】:
我想使用 python 读取 netcdf 文件。此文件包含双格式的 netcdf 变量。
我知道这个数量应该是复数,并且我知道最后一个参数总是 2 个数字(实数和即时值)。
我想以一种有效的方式读取 nedcdf 变量并将其分配给一个复杂的 python/numpy 变量。
目前我有以下无效程序:
import numpy as N
self.EIG2D = N.zeros((self.nkpt,self.nband,3,self.natom,3,self.natom),dtype=complex)
EIG2Dtmp = root.variables['second_derivative_eigenenergies'][:,:,:,:,:,:,:] #number_of_atoms,
# number_of_cartesian_directions, number_of_atoms, number_of_cartesian_directions,
# number_of_kpoints, product_mband_nsppol, cplex
for ikpt in N.arange(nkpt):
for iband in N.arange(nband):
for icart in N.arange(3):
for iatom in N.arange(natom):
for jcart in N.arange(0,3):
for jatom in N.arange(natom):
self.EIG2D[ikpt,iband,icart,iatom,jcart,jatom] = complex(EIG2Dtmp[iatom,icart,jatom,jcart,ikpt,iband,0],\
EIG2Dtmp[iatom,icart,jatom,jcart,ikpt,iband,1])
如何提高效率?
提前谢谢你,
塞缪尔。
【问题讨论】:
-
查看netCDF4-python 模块。您是否循环遍历
EIG2Dtmp数组的每个索引?如果是这样,你可以只做self.EIG2D = root.variables[:]而不是循环遍历所有内容。 -
我不是。 EIG2Dtmp 有 7 个参数,self.EIG2D 有 6 个参数。失踪的人只是真实的和我的一部分。
-
我明白了。接受this question 的答案似乎正是您所需要的。
-
值得看看该问题的其余答案。根据数组排序,在同一个数组上的简单“复杂视图”可能就足够了,如另一个答案中所述(不幸的是,我不知道如何链接到特定答案)
-
@Spencer Hill:它似乎有效:numpy.vectorize(complex)(Data[...,0], Data[...,1])。对我来说唯一的问题是我还需要更改顺序 A[a,b,c] ==> A[c,b,a] 但我想我可能应该为此创建一个新线程。非常感谢!
标签: python optimization numpy netcdf