首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以将布尔值写入R中的hdf5文件,而该文件将识别为8位枚举

是否可以将布尔值写入R中的hdf5文件,而该文件将识别为8位枚举
EN

Stack Overflow用户
提问于 2022-04-12 13:53:20
回答 2查看 143关注 0票数 1

我希望能够在HDF5中保存一个R真/假值,这样当将文件读入Python并检查数据类型是布尔值时,测试就会通过。现在我不能这么做。如果我用:

代码语言:javascript
复制
library(rhdf5)
h5file = H5Fcreate("newfile.h5")
h5space = H5Screate_simple(1,NULL, native = TRUE)
h5dataset1 = H5Dcreate(h5file, "dataset1", "H5T_NATIVE_HBOOL", h5space)
H5Dwrite(h5dataset1, TRUE)
h5closeAll()

如果使用HDFView (3.1.3)检查变量,可以看到保存的对象存储为8位无符号整数。

为了通过类似于np.array(getattr(x,attr)).dtype == bool的Python类型测试,该类型需要在HDFView中注册如下:8位枚举(0=FALSE,1=TRUE)。

如何使用两个R HDF5包rhdf5hdf5r中的任何一个编写这种类型的对象

EN

回答 2

Stack Overflow用户

发布于 2022-04-12 17:39:22

您可能希望探索第三个选项/包,即HDFql。要创建一个名为dataset1的8位枚举数据集,它包含两个成员(FALSE具有值0TRUE具有值1),可以使用R中的HDFql进行如下操作:

代码语言:javascript
复制
source("HDFql.R")

hdfql_execute("CREATE FILE newfile.h5")

hdfql_execute("CREATE DATASET newfile.h5 dataset1 AS ENUMERATION(FALSE AS 0, TRUE AS 1)")

有关更多信息,请查看HDFql 参考手册示例的工作原理。

票数 0
EN

Stack Overflow用户

发布于 2022-12-02 09:29:56

谢谢你的提问,很抱歉等了很久我才有时间回答。

在当时可用的rhdf5版本中,这是不可能的,而且还需要一种稍微不同的方法。H5T_NATIVE_HBOOL数据类型只是到无符号8位int (至少在Linux上)的映射。

要创建要查找的enum数据类型,必须使用H5Tenum_create()创建自定义数据类型,然后使用H5Tenum_insert()设置映射(例如TRUE = 1)。

下面是一个例子。您将需要rhdf5版本2.43.1或更高版本,您可以从https://github.com/grimbough/rhdf5获得该版本

代码语言:javascript
复制
library(rhdf5)

## our input data.  Note we're using 1 & 0
## but TRUE/FALSE would also work in this example
dat <- c(1, 1, 0, 1)

## create an HDF5 file
file <- tempfile(fileext = ".h5")
h5file = H5Fcreate(file)

## create the dataspace for our new data
h5space = H5Screate_simple(dims = dim(dat), NULL, native = TRUE)

## create the enum datatype with our mapping
## TRUE = 1 FALSE = 0
tid <- H5Tenum_create(dtype_id = "H5T_NATIVE_UCHAR")
H5Tenum_insert(tid, name = "TRUE", value = 1L)
H5Tenum_insert(tid, name = "FALSE", value = 0L)

## create the dataset with this new 
h5dataset1 = H5Dcreate(h5file, "dataset1", tid, h5space)

## write the data.  We have to use as.raw() because our
## base type is 8-bit and R integers are 32-bit
H5Dwrite(h5dataset1, as.raw(dat), h5type = tid)

## tidy up
h5closeAll()

我们可以使用h5ls命令行工具来检查我们的数据类型是8位枚举,并且我们有(0=FALSE,1=TRUE)映射。

代码语言:javascript
复制
system2("h5ls", args = c("-v", file))
#> Opened "/tmp/Rtmp4zU9m5/file36f657af24dcb.h5" with sec2 driver.
#> dataset1                 Dataset {4/4}
#>     Location:  1:800
#>     Links:     1
#>     Storage:   4 logical bytes, 4 allocated bytes, 100.00% utilization
#>     Type:      enum native unsigned char {
#>                    TRUE             = 1
#>                    FALSE            = 0
#>                }

我们也可以把它读回R。

代码语言:javascript
复制
## we can read it back in and get a factor
h5read(file, name = "/dataset1")
#> [1] TRUE  TRUE  FALSE TRUE 
#> Levels: TRUE FALSE

我不喜欢这个,因为你没有得到你所写的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71843969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档