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]]
这正是为什么笨拙的0ChunkedArray
,JaggedArray
等将成为内部“仅限专家使用”的原因笨拙1的用户界面中的类将有一个单独的笨拙的.Array
类和一个类型
,以了解它是否参差不齐。它是否由块或其他东西组成将是一个实现细节。这非常有意义。更准确地说,目前,我需要启动,停止,和content
,因为我需要应用不是numpy ufunc
的操作。因此,我提取数组的内容,应用我的操作,然后使用“``笨拙的.JaggedArray”重新构建生成的数组(内容=输出,开始=开始,停止=停止)“``对于这种特定情况,您建议哪种解决方案?对于这种特定情况,您可以使用我在上面推导的开始
,停止
,和内容
。其结果将是一个JaggedArray
,其内容
是一个ChunkedArray
,应该可以工作。我希望它不会出现问题。”如果您需要使ChunkedArray
非块化(例如,通过非ufunc传递),请连接块:np.concatenate(content.chunks)
或np.concatenate([x.array代表content.chunks中的x])
。