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

esyap4oy  于 2022-12-06  发布在  Python
关注(0)|答案(2)|浏览(120)

我希望能够在HDF 5中保存一个R TRUE/FALSE值,以便在将文件读入Python并检查数据类型是否为布尔时,测试能够通过。目前我无法做到这一点。如果我用途:

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=假,1=真)。
如何使用两个R HDF 5包rhdf5hdf5r中的任何一个来编写这种类型的对象?

jgwigjjp

jgwigjjp1#

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

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 reference manualexamples的工作原理。

a11xaf1n

a11xaf1n2#

谢谢你的问题,很抱歉,我已经有一段时间没有时间回答了。
这在当时可用的rhdf5版本中是不可能的,并且还需要一种稍微不同的方法。H5T_NATIVE_HBOOL数据类型只是到无符号8位int的Map(至少在Linux上是这样)。
要创建您正在寻找的枚举数据类型,您必须使用H5Tenum_create()创建一个自定义数据类型,然后使用H5Tenum_insert()设置Map(例如TRUE = 1)。
下面是一个例子。您需要rhdf5版本2.43.1或更新版本,可以从https://github.com/grimbough/rhdf5获得

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)Map。

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。

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

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

相关问题