Uproot 如何使用锯齿数组获得与root_numpy root2array()相同的root.iterate()输出

Uproot 如何使用锯齿数组获得与root_numpy root2array()相同的root.iterate()输出,uproot,Uproot,我知道类似的问题有一个解决方案: 但据我所知,它只适用于平根树。我想得到以下问题的广义解: 固定大小的维度但嵌套的数据,如粒子动量(px,py,pz),这些数据在根TTree中表示为向量 任意大小的维度数据 我为它应用asjagged的所有尝试都失败了。是否有可能避免案例(1)中的jaggedarray。如果数据是固定大小的,但存储为向量,则将其视为非固定大小。“根除”将始终将它们读取为锯齿状数组,因此在另一个问题中描述的asarray方法不可用 这就是说,如果您比文件的元数据更了解,并且愿意尝

我知道类似的问题有一个解决方案: 但据我所知,它只适用于平根树。我想得到以下问题的广义解:

  • 固定大小的维度但嵌套的数据,如粒子动量(px,py,pz),这些数据在根TTree中表示为
    向量
  • 任意大小的维度数据

  • 我为它应用
    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!你对固定大小维数据的解释对我的代码有效。这是非常有用的已经帮了我很多。因为任意尺寸的情况只是在计划阶段,我希望我能避免它。