Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何保存不同大小的h5py阵列?_Python_Numpy_Hdf5_H5py - Fatal编程技术网

Python 如何保存不同大小的h5py阵列?

Python 如何保存不同大小的h5py阵列?,python,numpy,hdf5,h5py,Python,Numpy,Hdf5,H5py,我指的是这个问题。我之所以写这篇新文章,是因为我没有真正理解这里给出的答案,希望有人能给我更多的解释 基本上,我的问题就像那里的链接一样。之前,我使用np.vstack并从中创建h5格式文件。以下是我的例子: import numpy as np import h5py import glob path="/home/ling/test/" def runtest(): data1 = [np.loadtxt(file) for file in glob.glob

我指的是这个问题。我之所以写这篇新文章,是因为我没有真正理解这里给出的答案,希望有人能给我更多的解释

基本上,我的问题就像那里的链接一样。之前,我使用
np.vstack
并从中创建
h5
格式文件。以下是我的例子:

import numpy as np
import h5py
import glob

path="/home/ling/test/"

def runtest():
    data1 = [np.loadtxt(file) for file in glob.glob(path + "data1/*.csv")]
    data2 = [np.loadtxt(file) for file in glob.glob(path + "data2/*.csv")]

    stack = np.vstack((data1, data2))

    h5f = h5py.File("/home/ling/test/2test.h5", "w") 
    h5f.create_dataset("test_data", data=stack)
    h5f.close()
如果大小都相同,则此操作非常有效。但是当大小不同时,它会抛出错误
TypeError:Object dtype dtype('O')没有本地HDF5等价物

从这里给出的答案中我了解到,我必须将数组保存为单独的数据集,但请看给出的示例片段<代码>对于adict.items()中的k,v和
grp.create_数据集(k,data=v)
k
应该是数据集的正确名称吗?就像我的例子一样,
测试数据
?什么是
v

下面是
vstack
stack

[[array([-0.07812, -0.07812, -0.07812, ..., -0.07812, -0.07812,  0.     ])
  array([-0.07812, -0.07812, -0.11719, ..., -0.07812, -0.07812,  0.     ])
  array([ 0.07812,  0.07812,  0.07812, ...,  0.07812,  0.07812,  0.     ])
  array([-0.07812, -0.07812, -0.07812, ..., -0.07812, -0.07812,  0.     ])
  array([ 0.07812,  0.07812,  0.07812, ...,  0.07812,  0.07812,  0.     ])
  array([ 0.03906,  0.07812,  0.07812, ...,  0.07812,  0.07812,  0.     ])
  array([ 0.07812,  0.07812,  0.07812, ...,  0.07812,  0.07812,  0.     ])
  array([-0.07812, -0.07812, -0.07812, ..., -0.07812, -0.07812,  0.     ])
  array([ 0.07812,  0.07812,  0.07812, ...,  0.07812,  0.11719,  0.     ])
  array([-0.07812, -0.07812, -0.07812, ..., -0.07812, -0.07812,  0.     ])
  array([ 0.07812,  0.07812,  0.07812, ...,  0.07812,  0.07812,  0.     ])
  array([-0.07812, -0.07812, -0.07812, ..., -0.07812, -0.07812,  0.     ])
  array([-0.15625, -0.07812, -0.07812, ..., -0.07812, -0.07812,  0.     ])
  array([-0.07812, -0.07812, -0.07812, ..., -0.07812, -0.07812,  0.     ])
  array([-0.11719, -0.07812, -0.07812, ..., -0.07812, -0.07812,  0.     ])
  array([-0.07812, -0.07812, -0.07812, ..., -0.07812, -0.15625,  0.     ])
  array([ 0.07812,  0.07812,  0.07812, ...,  0.07812,  0.07812,  0.     ])
  array([-0.07812, -0.07812, -0.07812, ..., -0.11719, -0.07812,  0.     ])
  array([ 0.07812,  0.07812,  0.07812, ...,  0.07812,  0.07812,  0.     ])
  array([-0.07812, -0.07812, -0.07812, ..., -0.07812, -0.07812,  0.     ])
  array([ 0.07812,  0.07812,  0.07812, ...,  0.07812,  0.07812,  0.     ])
  array([-0.07812, -0.11719, -0.07812, ..., -0.07812, -0.07812,  0.     ])
  array([-0.07812, -0.07812, -0.07812, ..., -0.07812, -0.07812,  0.     ])
  array([ 0.07812,  0.03906,  0.07812, ...,  0.03906,  0.07812,  0.     ])
  array([ 0.03906,  0.07812,  0.07812, ...,  0.07812,  0.07812,  0.     ])
  array([-0.07812, -0.07812, -0.07812, ..., -0.07812, -0.11719,  0.     ])
  array([ 0.07812,  0.07812,  0.07812, ...,  0.07812,  0.07812,  0.     ])
  array([ 0.07812,  0.07812,  0.07812, ...,  0.07812,  0.07812,  0.     ])
  array([ 0.07812,  0.07812,  0.07812, ...,  0.07812,  0.07812,  0.     ])
  array([ 0.07812,  0.07812,  0.07812, ...,  0.07812,  0.07812,  0.     ])]
 [ array([ 10.9375 ,  10.97656,  10.97656, ...,  11.05469,  11.05469,   1.     ])
  array([ 11.01562,  11.01562,  11.01562, ...,  11.09375,  11.09375,   1.     ])
  array([ 11.09375,  11.09375,  11.09375, ...,  11.09375,  11.09375,   1.     ])
  array([ 10.97656,  11.01562,  11.01562, ...,  11.13281,  11.09375,   1.     ])
  array([ 11.05469,  11.05469,  11.01562, ...,  11.09375,  11.09375,   1.     ])
  array([ 11.05469,  11.05469,  11.05469, ...,  11.05469,  11.05469,   1.     ])
  array([ 11.05469,  11.05469,  11.05469, ...,  11.05469,  11.13281,   1.     ])
  array([ 11.05469,  11.09375,  11.09375, ...,  11.09375,  11.09375,   1.     ])
  array([ 11.09375,  11.05469,  11.09375, ...,  11.05469,  11.05469,   1.     ])
  array([ 11.05469,  11.05469,  11.05469, ...,  11.09375,  11.09375,   1.     ])
  array([ 11.05469,  11.05469,  11.09375, ...,  11.05469,  11.05469,   1.     ])
  array([ 10.97656,  10.97656,  10.97656, ...,  11.05469,  11.05469,   1.     ])
  array([ 11.09375,  11.05469,  11.09375, ...,  11.09375,  11.09375,   1.     ])
  array([ 11.05469,  11.05469,  11.05469, ...,  11.05469,  11.05469,   1.     ])
  array([ 11.05469,  11.05469,  11.05469, ...,  11.09375,  11.17188,   1.     ])
  array([ 11.09375,  11.09375,  11.09375, ...,  10.97656,  11.09375,   1.     ])
  array([ 11.09375,  11.09375,  11.09375, ...,  11.05469,  11.05469,   1.     ])
  array([ 11.05469,  11.05469,  11.05469, ...,  11.05469,  11.05469,   1.     ])
  array([ 11.05469,  11.01562,  11.05469, ...,  11.01562,  11.01562,   1.     ])
  array([ 10.78125,  10.78125,  10.78125, ...,  11.05469,  11.05469,   1.     ])
  array([ 11.13281,  11.09375,  11.13281, ...,  11.09375,  11.09375,   1.     ])
  array([ 11.13281,  11.09375,  11.09375, ...,  11.05469,  11.05469,   1.     ])
  array([ 10.97656,  10.97656,  10.9375 , ...,  11.05469,  11.05469,   1.     ])
  array([ 11.05469,  11.09375,  11.05469, ...,  11.09375,  11.09375,   1.     ])
  array([ 10.9375 ,  10.9375 ,  10.9375 , ...,  11.09375,  11.09375,   1.     ])
  array([ 11.05469,  11.05469,  11.05469, ...,  11.05469,  11.05469,   1.     ])
  array([ 10.9375 ,  10.89844,  10.9375 , ...,  11.05469,  11.09375,   1.     ])
  array([ 10.9375 ,  10.97656,  10.97656, ...,  11.05469,  11.05469,   1.     ])
  array([ 10.89844,  10.89844,  10.89844, ...,  11.05469,  11.09375,   1.     ])
  array([ 11.05469,  11.05469,  11.05469, ...,  11.01562,  11.01562,   1.     ])]]
谢谢你的帮助和解释

更新 我用熊猫解决了这个问题。起初,我使用了Pierre de Buyl的建议,但当我尝试加载/读取文件/数据集时,它给了我错误。我尝试了
test\u data=h5f[“data1/file1”][:]
。这给了我一个错误,说明
无法打开对象(对象“file1”不存在)

我通过使用pandas.read_hdf
读取
2test.h5
进行检查,结果显示文件为空。我在网上搜索了其他解决方案,找到了这个。我已经修改过了:

import numpy as np
import glob

import pandas as pd

path = "/home/ling/test/"

def runtest():
    data1 = [np.loadtxt(file) for file in glob.glob(path + "data1/*.csv")]
    data2 = [np.loadtxt(file) for file in glob.glob(path + "data2/*.csv")]

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

combine = df1.append(df2, ignore_index=True)

# sort the NaN to the left
combinedf = combine.apply(lambda x : sorted(x, key=pd.notnull), 1)
combinedf.to_hdf('/home/ling/test/2test.h5', 'twodata')


runtest()
对于阅读,我只是使用

input_data = pd.read_hdf('2test.h5', 'twodata')
read_input = input_data.values

read1 = read_input[:, -1] # read/get last column for example

HDF5文件中的基本元素是组(类似于目录)和数据集(类似于数组)

NumPy将创建一个包含许多不同输入的数组。当试图从不同的元素(即不同的长度)创建数组时,NumPy返回类型为“O”的数组。在中查找对象。然后,使用NumPy没有什么好处,因为它类似于标准的Python列表

HDF5无法存储类型为“O”的数组,因为它没有泛型数据类型(只支持一些C结构类型对象)

最明显的解决方案是将数据存储在HDF5数据集中,每个表“一个数据集”。您保留了在单个文件中收集数据的优势,并且可以“像dict一样”访问元素

请尝试以下代码:

import numpy as np
import h5py
import glob

path="/home/ling/test/"

def runtest():
    h5f = h5py.File("/home/ling/test/2test.h5", "w") 
    h5f.create_group('data1')
    h5f.create_group('data2')

    [h5f.create_dataset(file[:-4], data=np.loadtxt(file)) for file in glob.glob(path + "data1/*.csv")]
    [h5f.create_dataset(file[:-4], data=np.loadtxt(file)) for file in glob.glob(path + "data2/*.csv")]

    h5f.close()
阅读:

h5f = h5py.File("/home/ling/test/2test.h5", "r")
test_data = h5f['data1/thefirstfilenamewithoutcsvextension'][:]

HDF5文件中的基本元素是组(类似于目录)和数据集(类似于数组)

NumPy将创建一个包含许多不同输入的数组。当试图从不同的元素(即不同的长度)创建数组时,NumPy返回类型为“O”的数组。在中查找对象。然后,使用NumPy没有什么好处,因为它类似于标准的Python列表

HDF5无法存储类型为“O”的数组,因为它没有泛型数据类型(只支持一些C结构类型对象)

最明显的解决方案是将数据存储在HDF5数据集中,每个表“一个数据集”。您保留了在单个文件中收集数据的优势,并且可以“像dict一样”访问元素

请尝试以下代码:

import numpy as np
import h5py
import glob

path="/home/ling/test/"

def runtest():
    h5f = h5py.File("/home/ling/test/2test.h5", "w") 
    h5f.create_group('data1')
    h5f.create_group('data2')

    [h5f.create_dataset(file[:-4], data=np.loadtxt(file)) for file in glob.glob(path + "data1/*.csv")]
    [h5f.create_dataset(file[:-4], data=np.loadtxt(file)) for file in glob.glob(path + "data2/*.csv")]

    h5f.close()
阅读:

h5f = h5py.File("/home/ling/test/2test.h5", "r")
test_data = h5f['data1/thefirstfilenamewithoutcsvextension'][:]


stack
看起来像什么?它给了我同样的错误。stack看起来像什么?如果您对我的问题感到困惑,只需执行
打印(堆栈)
并将输出复制/粘贴到您的问题中即可。很抱歉误解了您的问题。我用
stack
vstack
的结果编辑了我的问题,要么需要将缺少的列添加到较短的行中,用0或NAN填充,要么需要将数据存储在两个单独的HDF5数据集中。您不能以您尝试的方式存储“锯齿”(非矩形)数组。
stack
是什么样子的?它给了我同样的错误。stack是什么样子的?如果您对我的问题感到困惑,只需执行
打印(堆栈)
并将输出复制/粘贴到您的问题中即可。很抱歉误解了您的问题。我用
stack
vstack
的结果编辑了我的问题,要么需要将缺少的列添加到较短的行中,用0或NAN填充,要么需要将数据存储在两个单独的HDF5数据集中。你不能用你正在尝试的方式存储“锯齿”(非矩形)数组。嗨,你的答案对我有用。我只是想问一下,你能详细说明一下
文件[:-4]
文件是一个以
.csv
结尾的字符串。由于在数据集的名称中包含文件扩展名并不常见,因此我将其删除。对于字符串,
file[:-4]
将返回省略了最后四个元素的字符串,即不带尾随的
.csv
。您好,抱歉再次询问。显然,阅读它会给我一个错误,即
无法打开对象(对象“file1”不存在)
您能明确给出给出此错误的行吗?您是否使用文件路径作为
data1/mlqskfdjmlsqjfd
(不使用
.csv
)来访问数据?据我所知,您已将解决方案更改为使用Pandas高级存储设施,这将掩盖技术细节。使用我提供的答案,原始问题仍然得到了解决。我觉得在这一点上“联合国批准”这个答案是不合适的,但无论如何。不过,这主要是给其他对使用HDF5存储感兴趣的用户写的。您好,您的回答对我很有用。我只是想问一下,你能详细说明一下
文件[:-4]
文件是一个以
.csv
结尾的字符串。由于在数据集的名称中包含文件扩展名并不常见,因此我将其删除。对于字符串,
file[:-4]
将返回省略了最后四个元素的字符串,即不带尾随的
.csv
。您好,抱歉再次询问。显然,为了