【问题标题】:Convert string data in HDF5 File to float Format将 HDF5 文件中的字符串数据转换为浮点格式
【发布时间】:2021-04-29 05:38:16
【问题描述】:

我需要将字符串数据从 HDF5 文件转换为浮点格式,以便在具有 l b 坐标的 Skyplot (Astropy) 中使用。数据在这里: https://wwwmpa.mpa-garching.mpg.de/~ensslin/research/data/faraday2020.html (法拉第天空 2020)

到目前为止我编写的代码是:

from astropy import units as u
from astropy.coordinates import SkyCoord
import matplotlib.pyplot as plt
import numpy as np
import h5py

dat = []

ggl=[]

ggb=[]

f1= h5py.File('/home/nikita/faraday_2020/faraday2020.hdf5','r')
data = f1.get('faraday_sky_mean')
faraday_sky_mean = np.array(data)
data1 = f1.get('faraday_sky_std')
faraday_sky_std = np.array(data1)

n1 = 0
for line in f1:
   s = line.split()
   dat.append(s)
   n1 = n1 +1  
 #
for i in range(0,n1):
   ggl.append(float(dat[i][0])) # galactic coordinates input
   ggb.append(float(dat[i][1]))
 
f1.close()

但是我得到了错误:

ggl.append(float(dat[i][0])) # galactic coordinates input

ValueError: could not convert string to float: 'faraday_sky_mean'

请帮忙。谢谢。

【问题讨论】:

标签: type-conversion python-3.6 hdf5


【解决方案1】:

你问什么和你需要什么(我认为)是两件不同的事情。 此行不是读取 HDF5 文件的方法:for line in f1: 您需要使用 HDF5 API 来读取它(h5py 是其中之一)。

我认为您想读取数据集 faraday_sky_meanfaraday_sky_std 并将数组加载到列表 gglggb 中。为此,请使用此代码。它将创建 2 个列表,每个列表有 3145728 个 float64 值。

with h5py.File('faraday2020.hdf5','r') as hdf:
    print(list(hdf.keys()))
    faraday_sky_mean = hdf['faraday_sky_mean'][:]
    faraday_sky_std = hdf['faraday_sky_std'][:]
    
print(faraday_sky_mean.shape, faraday_sky_mean.dtype) 
print(f'Max Mean={max(faraday_sky_mean)}, Min Mean={min(faraday_sky_mean)}') 
print(faraday_sky_std.shape, faraday_sky_std.dtype) 
print(f'Max StdDev={max(faraday_sky_std)}, Min StdDev={min(faraday_sky_std)}') 

ggl = faraday_sky_mean.tolist()
print(len(ggl),type(ggl[0]))
ggb = faraday_sky_std.tolist()
print(len(ggb),type(ggb[0]))

上述过程将数据保存为 NumPy 数组和 Python 列表。如果只需要列表(不需要数组),可以缩短代码如下:

with h5py.File('faraday2020.hdf5','r') as hdf:
    ggl = hdf['faraday_sky_mean'][:].tolist()
    print(len(ggl),type(ggl[0]))
    ggb = hdf['faraday_sky_std'][:].tolist()
    print(len(ggb),type(ggb[0]))

【讨论】:

  • 感谢您的回复。我面临的问题是存在的数据以 float64 的形式存在,我想将其加载到 ggl 和 ggb 中(由您正确指出)。在此之后,我想将每个浮点值转换为我正在使用天文命令 gl = ggl * u.degree gb = ggb * u.degree c = SkyCoord(l=gl, b=gb, frame='galactic', unit = (u.deg, u.deg)) #, l_rad = c.l.wrap_at(180 * u.deg).radian b_rad = c.b.radian 但是我得到了错误
猜你喜欢
  • 1970-01-01
  • 2019-06-20
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多