将尴尬的数组与索引数组一起使用时出错

HEP N008

我目前有一个值列表和一个尴尬的整数值数组。我想要相同维数的尴尬数组,但其中的值是与笨拙数组的整数值相对应的“值”数组的索引。例如:

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 * float64arr具有type 2 * var * int64没有规则values[arr]

由于您似乎想要切片valuesarr[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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将v-for与数组中的数组一起使用时,如何访问父数组的数据?

在C中将Free与2D数组一起使用时出错

将argv与函数一起使用时出错

将statsmodels与pyinstaller一起使用时出错

将fnAddData与数据顺序一起使用时出错

将 ScrollChor 与 NavItem 一起使用时出错

将FutureBuilder与本地JSON一起使用时出错

将AutoMapper与异步方法一起使用时出错

将ngMaterial与ngRoute一起使用时出错

将Express会话与Express一起使用时出错

将SharedElementTransition与recyclerView一起使用时出错

将SparkJob与NamedRddSupport一起使用时出错

将cout与指针值一起使用时出错

将 File 与 ImagePicker Flutter 一起使用时出错

与数组一起使用时,-'a'的功能是什么

与数组一起使用时的双指针差异

与数组一起使用时 C 中“&”的含义

在将new与指针一起使用时,指定数组的指定长度

将 std::find 与 std::string 数组一起使用时出现问题

将 cin 与数组一起使用

将%s与数组一起使用

将 np.testing 与 2D 数组一起使用时如何打印整个数组?

索引序列将数组加在一起

与冒号(:)一起使用时,为什么Python 2D数组索引顺序不重要

与数组索引中的$ b ++一起使用时,PHP为什么对$ b和$ b = $ b求值的方式不同

如何将array_push与关联数组和索引键一起使用?

如何将 np.where 函数与数组每个元素的索引一起使用?

ValueError:将索引与seaborn线图一起使用时,无法解释输入“索引”

将.setValues与空的嵌套数组一起使用时,Google脚本会写入“未定义”