Python 3.x 将笨拙数组与索引数组一起使用时出错
我目前有一个值列表和一个笨拙的整数值数组。我想要相同维度的笨拙数组,但其中的值是与笨拙数组的整数值对应的“值”数组的索引。例如:Python 3.x 将笨拙数组与索引数组一起使用时出错,python-3.x,awkward-array,Python 3.x,Awkward Array,我目前有一个值列表和一个笨拙的整数值数组。我想要相同维度的笨拙数组,但其中的值是与笨拙数组的整数值对应的“值”数组的索引。例如: values = ak.Array(np.random.rand(100)) arr = ak.Array((np.random.randint(0, 100, 33), np.random.randint(0, 100, 125))) 我想要类似于值[arr]的值,但这会产生以下错误: >>> values[arr] Traceback (mos
values = ak.Array(np.random.rand(100))
arr = ak.Array((np.random.randint(0, 100, 33), np.random.randint(0, 100, 125)))
我想要类似于值[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
>>值[arr]
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Anaconda3\lib\site packages\shufk\highlevel.py”,第943行,在\uuu getitem中__
返回ak.\u util.wrap(self.\u布局[where],self.\u行为)
ValueError:无法将长度为2的锯齿形切片放入大小为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'>]
>>值=([values[i]表示arr中的i])
>>>价值观
[, ]
有没有别的办法,或者就是这样?恐怕对我的申请来说太慢了
谢谢 如果您试图避免使用Python for循环来提高性能,请注意,第一行将NumPy数组转换为笨拙的(无循环,非常快):
>values=ak.Array(np.random.rand(100))
但是第二行在Python中迭代数据(有一个慢循环):
arr=ak.Array((np.random.randint(010033),np.random.randint(0100125)))
因为两个NumPy数组的元组不是NumPy数组。它是一个泛型iterable,构造函数返回到
在你的主要问题上,arr
没有对值进行切片的原因是arr
是一个锯齿状数组,而values
不是:
>>值
>>>啊
注意类型:values
具有类型100*float64
和arr
具有类型2*var*int64
。没有关于值[arr]
的规则
由于您似乎希望使用arr[0]
对值进行切片,然后使用arr[1]
(根据您的列表理解),因此可以通过对arr
的每个元素复制值
,然后进行切片的矢量化方式来完成
>#np.newaxis在连接之前为值提供一个长度为1的维度。
>>>duplicated=ak.concatenate([values[np.newaxis]]]*2)
>>>复制
现在,duplicated
具有长度2和一级嵌套,就像arr
一样,因此arr
可以对其进行切片。结果数组的长度也为2,但每个子列表的长度是arr
中每个子列表的长度,而不是100
>>重复[arr]
>>>ak.num(重复[arr])
如果你从2个这样的列表扩展到一个大的数字,那么这将消耗大量的内存。然后,此操作的输出大小也将按“值的长度”
“×arr的长度”缩放。如果这个“2”不打算放大(如果它最多是数千,而不是数百万或更多),那么我就不会担心Python for循环的速度。Python可以很好地扩展数千个对象,但不能扩展数十亿个对象(当然,这取决于被扩展对象的大小!)。for循环肯定太耗时了;我有1100多个文件需要爬过,它只挂在其中一个文件上(每个文件有10个成千上万的事件,点击率高达数百次,因此我们的点击率高达数百万)。我尝试了一下,但现在我遇到了另一个与此相关的问题。在我的数据中,我使用的是一个*.root文件,使用的数组很笨拙。本例中的“arr”未定义为整数,但它们是整数值。如何将笨拙的数组转换为整数?也许这应该是一个单独的问题。我知道它可以通过.astype(int)在numpy中完成;这在尴尬中存在吗?既然主要问题已经回答了,我将提出一个关于整数位的新问题。再次感谢!