Uproot 如何使用锯齿数组获得与root_numpy root2array()相同的root.iterate()输出
我知道类似的问题有一个解决方案: 但据我所知,它只适用于平根树。我想得到以下问题的广义解:Uproot 如何使用锯齿数组获得与root_numpy root2array()相同的root.iterate()输出,uproot,Uproot,我知道类似的问题有一个解决方案: 但据我所知,它只适用于平根树。我想得到以下问题的广义解: 固定大小的维度但嵌套的数据,如粒子动量(px,py,pz),这些数据在根TTree中表示为向量 任意大小的维度数据 我为它应用asjagged的所有尝试都失败了。是否有可能避免案例(1)中的jaggedarray。如果数据是固定大小的,但存储为向量,则将其视为非固定大小。“根除”将始终将它们读取为锯齿状数组,因此在另一个问题中描述的asarray方法不可用 这就是说,如果您比文件的元数据更了解,并且愿意尝
向量
我为它应用
asjagged
的所有尝试都失败了。是否有可能避免案例(1)中的jaggedarray。如果数据是固定大小的,但存储为向量
,则将其视为非固定大小。“根除”将始终将它们读取为锯齿状数组,因此在另一个问题中描述的asarray
方法不可用
这就是说,如果您比文件的元数据更了解,并且愿意尝试不受支持的黑客攻击,则可以强制对向量的解释始终包含三个元素。下面是一个示例,首先,我们需要一个合适的根文件:
TFile*f=新的TFile(“tmp.root”,“重新创建”);
TTree*t=新的TTree(“t”,“t”);
std::向量x;
t->分支(“x”和&x);
x={101、102、103};
t->Fill();
x={201202203};
t->Fill();
x={301,302,303};
t->Fill();
x={401402403};
t->Fill();
x={501502503};
t->Fill();
x={601602603};
t->Fill();
t->Write();
f->Close();
现在,在《连根拔起》中阅读这篇文章的正常方式是使用JaggedArray:
>>导入根除
>>>branch=root.open(“tmp.root”)[“t”][“x”]
>>>branch.array()
>>>分部.口译
asjagged(asdtype('>f8'),10)
但这会在您每次读取它时分配新数组,并进行一些操作以查找边界,您知道边界是规则的。(连根拔起并不知道这一点。)
STL向量的头正好有10个字节长。在这之后,它的内容将按顺序从第一个到最后一个序列化,然后再转到下一个STL向量。对于三个8字节的浮点数,即10+8+8+8=34字节,大小始终相同。事实上,它总是碰巧是相同的大小是至关重要的以下
可以将固定大小结构的数组表示为数据类型:
>>array=branch.array(unlot.asdtype([(“header”,“S10”),(“x”,“f8”),(“y”,“f8”),(“z”,“f8”)]))
>>>排列
数组([(b'@\x00\x00\x1e\x00\t\x00\x00\x00\x03',101,102,103.),
(b'@\x00\x00\x1e\x00\t\x00\x00\x00\x03',201,202,203。),
(b'@\x00\x00\x1e\x00\t\x00\x00\x00\x03',301,302,303。),
(b'@\x00\x00\x1e\x00\t\x00\x00\x00\x03',401,402,403。),
(b'@\x00\x00\x1e\x00\t\x00\x00\x00\x03',501,502,503。),
(b'@\x00\x00\x1e\x00\t\x00\x00\x00\x03',601,602,603。),
数据类型=[('header','S10'),('x','>>数组[[“x”,“y”,“z”]]
数组([(101,102,103.),(201,202,203.),(301,302,303.),
(401., 402., 403.), (501., 502., 503.), (601., 602., 603.)],
数据类型={'names':['x','y','z'],'formats':['f8'),('y','>f8'),('z','>f8'))
如上所述,big
必须至少与要读取的数据集一样大,读取该数据集将返回该数组的修剪视图。它不分配新数组,数据存储在big
中:
>>大[[“x”,“y”,“z”][:10]
阵列([(1.01000000e+002,1.02000000e+002,1.03000000e+002),
(2.01000000e+002、2.02000000e+002、2.03000000e+002),
(3.01000000e+002、3.02000000e+002、3.03000000e+002),
(4.01000000e+002、4.02000000e+002、4.03000000e+002),
(5.01000000e+002、5.02000000e+002、5.03000000e+002),
(6.01000000e+002、6.02000000e+002、6.03000000e+002),
(1.22164945e-309、5.26335088e-310、1.22167067e-309),
(-5.70498984e+158,5.97958175e+158,-5.97958175e+158),
(-4.92033505e+032,-4.92033505e+032,-4.92033505e+032),
(3.77957352e+011、3.77957221e+011、3.77957320e+011)],
数据类型={'names':['x','y','z'],'formats':['>f8','>f8','>f8'],'offset':[10,18,26],'itemsize':34})
读取的6个事件之外的所有内容都是未初始化的垃圾,因此我建议使用branch.array
函数的修剪输出;这只是为了表明big
正在填充,而不是获得新数组
根据您的问题(2),如果数据不规则(每个条目的字节数)还有,请记住,上述技术并没有得到官方的支持:你必须知道你的数据是规则的,你必须知道STL向量有一个10字节的头,这不是我们期望大多数用户都知道的。谢谢Jim!你对固定大小维数据的解释对我的代码有效。这是非常有用的已经帮了我很多。因为任意尺寸的情况只是在计划阶段,我希望我能避免它。