我目前有一个值列表和一个尴尬的整数值数组。我想要相同维数的尴尬数组,但其中的值是与笨拙数组的整数值相对应的“值”数组的索引。例如:
values = ak.Array(np.random.rand(100))
arr = ak.Array((np.random.randint(0, 100, 33), np.random.randint(0, 100, 125)))
我想要类似values [arr]的东西,但是会出现以下错误:
>>> values[arr]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Anaconda3\lib\site-packages\awkward\highlevel.py", line 943, in __getitem__
return ak._util.wrap(self._layout[where], self._behavior)
ValueError: cannot fit jagged slice with length 2 into RegularArray of size 100
如果我循环运行它,我会得到想要的结果:
>>> values = ([values[i] for i in arr])
>>> values
[<Array [0.842, 0.578, 0.159, ... 0.726, 0.702] type='33 * float64'>, <Array [0.509, 0.45, 0.202, ... 0.906, 0.367] type='125 * float64'>]
还有另一种方法可以做到吗?恐怕对我的应用程序来说太慢了。
谢谢!
如果您要避免使用Python进行性能循环,请注意第一行使用ak.from_numpy将NumPy数组强制转换为Awkward (无循环,非常快):
>>> values = ak.Array(np.random.rand(100))
但是第二行遍历Python中的数据(具有慢速循环):
>>> arr = ak.Array((np.random.randint(0, 100, 33), np.random.randint(0, 100, 125)))
因为两个NumPy数组的元组不是NumPy数组。这是一个通用的可迭代对象,构造函数回退到ak.from_iter。
在您的主要问题上,arr
不进行切片的原因values
是因为arr
是锯齿状数组而values
不是:
>>> values
<Array [0.272, 0.121, 0.167, ... 0.152, 0.514] type='100 * float64'>
>>> arr
<Array [[15, 24, 9, 42, ... 35, 75, 20, 10]] type='2 * var * int64'>
注意类型:values
具有type100 * float64
和arr
具有type 2 * var * int64
。没有规则values[arr]
。
由于您似乎想要切片values
,arr[0]
然后arr[1]
(从列表理解中)进行切片,因此可以通过values
对的每个元素进行复制arr
然后切片来以矢量化的方式完成。
>>> # The np.newaxis is to give values a length-1 dimension before concatenating.
>>> duplicated = ak.concatenate([values[np.newaxis]] * 2)
>>> duplicated
<Array [[0.272, 0.121, ... 0.152, 0.514]] type='2 * 100 * float64'>
现在duplicated
具有长度2和一层嵌套,就像一样arr
,因此arr
可以对其进行切片。结果数组的长度也为2,但是每个子列表的长度是中的每个子列表的长度arr
,而不是100。
>>> duplicated[arr]
<Array [[0.225, 0.812, ... 0.779, 0.665]] type='2 * var * float64'>
>>> ak.num(duplicated[arr])
<Array [33, 125] type='2 * int64'>
如果您从2个这样的列表扩展到大量,那么这将消耗大量内存。再一次,此操作的输出大小也将按“ length of values
”ד length of arr
”定标。如果这个“ 2”不会扩大(如果最多是数千个,而不是数百万个或更多),那么我就不用担心Python for loop的速度。Python可以很好地扩展数千个而不是数十亿个(当然,这取决于要扩展的事物的大小!)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句