numpy 使用mktree在分支上强制转换char* 类型

rhfm7lfc  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(118)

我试图重新创建一个包含char* 类型分支的根文件(根文件将其解释为AsStrings())
当使用mktree根无法识别np.dtype('string ')时,当尝试np.dtype(' S ')时,我得到:
TypeError: cannot write NumPy dtype |S0 in TTree
是否可以这样做,或者只是没有在包中实现?

2uluyalo

2uluyalo1#

“字符串”不是WritableTTree支持的数据类型之一。请查看www.example.com下的蓝框https://uproot.readthedocs.io/en/latest/basic.html#writing-ttrees-to-a-file以获取完整列表。
但是,也可以写一些字符串类型的数据,字符串的Awkward Arrays就是uint8类型的列表,带有特殊的元数据(__array__: "strings"参数),指示它应该被解释为字符串,实际上有两种类型,"string""bytestring",我们假设前者是UTF-8编码的,而后者不是。
通过从数组中删除参数,这些数据 * 可以 * 写入ROOT文件,这样它看起来就像一个普通的整数数组:

>>> import awkward as ak
>>> array = ak.Array(["one", "two", "three", "four", "five"])
>>> ak.without_parameters(array)
<Array [[111, 110, 101], ..., [102, 105, 118, 101]] type='5 * var * uint8'>

下面是将这些数据写入ROOT文件的方法:

>>> import uproot
>>> file = uproot.recreate("/tmp/some.root")
>>> file["tree"] = {"branch": ak.without_parameters(array)}
>>> file["tree"].show()
name                 | typename                 | interpretation                
---------------------+--------------------------+-------------------------------
nbranch              | int32_t                  | AsDtype('>i4')
branch               | uint8_t[]                | AsJagged(AsDtype('uint8'))

当您回读它们时,uint8_t*数组可能会被转换为char*数组,但是要注意!(以\x00字节结束)。C和C++中的许多字符串解释函数都不希望这样。有一些函数,如strncpystd::stringtwo-argument constructor,可以给它字符串长度信息,这样它们就不会寻找空终止符,字符串长度信息是计数器分支,上面的nbranch
我承认这是令人不快的。我在Uroot上使用just opened a feature request以自然的方式写入字符串数据,使用ROOT的TLeafC,而不是这个黑客。

相关问题