Python ChunkeArray的内容、开始和停止-由lazyarray构建

Python ChunkeArray的内容、开始和停止-由lazyarray构建,python,uproot,awkward-array,Python,Uproot,Awkward Array,我有一些代码可以很好地用于JaggedArrays提取内容,开始,停止,但我想在一些chunkedarray上运行相同的代码,这些代码是从根除中的懒散数组获得的。 不幸的是,我得到了以下错误: ~/.local/lib/python3.7/site-packages/awkward/array/base.py in __getattr__(self, where) 254 raise AttributeError("while trying to

我有一些代码可以很好地用于
JaggedArrays
提取
内容
开始
停止
,但我想在一些
chunkedarray
上运行相同的代码,这些代码是从
根除
中的
懒散数组
获得的。 不幸的是,我得到了以下错误:

~/.local/lib/python3.7/site-packages/awkward/array/base.py in __getattr__(self, where)
    254                     raise AttributeError("while trying to get column {0}, an exception occurred:\n{1}: {2}".format(repr(where), type(err), str(err)))
    255             else:
--> 256                 raise AttributeError("no column named {0}".format(repr(where)))
    257 
    258     def __dir__(self):

AttributeError: no column named 'starts'

有什么办法可以让它工作吗?

现在越来越清楚的是,像
启动
停止
、和
内容
这样的属性不应该是公共的,它们应该被视为内部构件。它们是
JaggedArray
工作的一部分,但不是任何锯齿数据的属性(对于某些数组长度
N
和内部类型
X
,其
类型为
[0,N)->[0,inf)->X的任何数组)

您不希望在意锯齿状数据是
ChunkedArray
,对于许多操作,如
flatte()
计数
,你不在乎:它们在
ChunkedArray
上与
JaggedArray
一样工作良好。但是
开始
停止
,和
内容
永远不会是这样的:除了
JaggedArray
的具体实现之外,它们没有任何意义

例如,考虑以下
ChunkedArray

>>数组=笨拙的.ChunkedArray([笨拙的.fromiter([1,2,3],[4,5]),
…笨拙。fromiter([[100],[200300]]))
>>>排列
我们可以在每个
块的
开始
停止
,但这可能不是您想要的:

>[x.start代表数组中的x.chunks]
[数组([0,3,3]),数组([0,1])]
>>>[x.停止数组中的x.块]
[数组([3,3,5]),数组([1,3])]
(在您的例子中,您有惰性数组,它们是
virtualray
ChunkedArray
,因此您必须执行
x.array.starts
而不是
x.starts
,以解压缩
virtualray
。出于同样的原因,这是另一个可能是内部属性。)

请注意,第二个
块的
开始
0
处重新开始。这是因为索引与当前
相关(因此
可以并行处理)。如果在数据分析中使用
开始
,这将是一个重要的更正。(如果len(stops)>0,则可以将前一个
块的
停止[-1]添加到当前
,使数字成为全局数字。)

一个可能更好的替代方法是从
计数
构造有意义的偏移量。
ChunkedArray
有一个有效的
计数

>array.counts
数组([3,0,2,1,2])
计数
是锯齿状数据中每个子阵列的长度,它是
偏移
的导数,即
开始
停止
重叠:

偏移量=numpy.empty(len(数组)+1,dtype=int) >>>偏移量[0]=0 >>>numpy.cumsum(array.counts,out=offset[1:]) 数组([3,3,5,6,8]) >>>抵消 数组([0,3,3,5,6,8]) >>>开始、停止=偏移量[:-1],偏移量[1:] >>>开始 数组([0,3,3,5,6]) >>>停止 数组([3,3,5,6,8])
您可以将它们用作
开始
停止
,但前提是您拥有某种类型的“内容”,其中
开始
停止
是完全连续的。对于
JaggedArray
内容
,这并不能保证,但
展平()
将为您做到这一点:

>content=array.flatte()
>>>内容
现在,例如,索引
3
处的子阵列是

>>内容[开始[3]:停止[3]]

这正是为什么笨拙的0
ChunkedArray
JaggedArray
等将成为内部“仅限专家使用”的原因笨拙1的用户界面中的类将有一个单独的
笨拙的.Array
类和一个
类型
,以了解它是否参差不齐。它是否由块或其他东西组成将是一个实现细节。

这非常有意义。更准确地说,目前,我需要
启动
停止
,和
content
,因为我需要应用不是
numpy ufunc
的操作。因此,我提取数组的内容,应用我的操作,然后使用“``笨拙的.JaggedArray”重新构建生成的数组(内容=输出,开始=开始,停止=停止)“``对于这种特定情况,您建议哪种解决方案?对于这种特定情况,您可以使用我在上面推导的
开始
停止
,和
内容
。其结果将是一个
JaggedArray
,其
内容
是一个
ChunkedArray
,应该可以工作。我希望它不会出现问题。”如果您需要使
ChunkedArray
非块化(例如,通过非ufunc传递),请连接块:
np.concatenate(content.chunks)
np.concatenate([x.array代表content.chunks中的x])