1

我有一个JaggedArray( awkward.array.jagged.JaggedArray) 包含指向另一个位置的索引JaggedArray。两个数组具有相同的长度,但包含的每个数组numpy.ndarrays可以JaggedArrays具有不同的长度。我想使用第一个数组的索引对第二个数组进行排序,同时从第二个数组中删除未从第一个数组索引的元素。第一个数组还可以包含-1(如果需要,也可以替换为None,但目前不是这种情况)的值,这意味着第二个数组中没有匹配项。在这种情况下,第一个数组中的相应位置应设置为默认值(例如0)。

这是一个实际示例以及我目前如何解决此问题:

import uproot
import numpy as np
import awkward

def good_index(my_indices, my_values):
    my_list = []
    for index in my_indices:
        if index > -1:
            my_list.append(my_values[index])
        else:
            my_list.append(0)
    return my_list

indices = awkward.fromiter([[0, -1], [3,1,-1], [-1,0,-1]])
values = awkward.fromiter([[1.1, 1.2, 1.3], [2.1,2.2,2.3,2.4], [3.1]])

new_map = awkward.fromiter(map(good_index, indices, values))

结果new_map是:[[1.1 0.0] [2.4 2.2 0.0] [0.0 3.1 0.0]]

有没有更有效/更快的方法来实现这一目标?我在想一个人可以使用numpy诸如 之类的功能numpy.where,但是由于长度不同ndarrays,至少对于我尝试的方式而言,这失败了。

4

1 回答 1

0

如果values保证中的所有子数组都不为空(以便索引 with-1返回最后一个子元素,而不是错误),那么您可以这样做:

>>> almost = values[indices]       # almost what you want; uses -1 as a real index
>>> almost.content = awkward.MaskedArray(indices.content < 0, almost.content)
>>> almost.fillna(0.0)
<JaggedArray [[1.1 0.0] [2.4 2.2 0.0] [0.0 3.1 0.0]] at 0x7fe54c713c88>

最后一步是可选的,因为没有它,缺少的元素是None,而不是0.0

如果其中的某些子数组values为空,您可以pad确保它们至少有一个子元素。所有原始子元素的索引方式与以前相同,因为pad如果需要,只会增加长度。

>>> values = awkward.fromiter([[1.1, 1.2, 1.3], [], [2.1, 2.2, 2.3, 2.4], [], [3.1]])
>>> values.pad(1)
<JaggedArray [[1.1 1.2 1.3] [None] [2.1 2.2 2.3 2.4] [None] [3.1]] at 0x7fe54c713978>
于 2019-10-11T16:55:57.847 回答