【问题标题】:How to pass complex arguments in netcdf python如何在netcdf python中传递复杂的参数
【发布时间】: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


【解决方案1】:

感谢 Spencer Hill,我的解决方案是

self.EIG2D = numpy.vectorize(complex)(EIG2Dtmp[...,0], EIG2Dtmp[...,1])

也可以参考Numpy: Creating a complex array from 2 real ones?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2023-04-10
    • 2014-08-28
    • 2023-03-25
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多