Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 将笨拙数组与索引数组一起使用时出错_Python 3.x_Awkward Array - Fatal编程技术网

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中完成;这在尴尬中存在吗?既然主要问题已经回答了,我将提出一个关于整数位的新问题。再次感谢!