繁体   English   中英

在给定无序输入和相应 ID 的情况下设置元素的 Numpy-thonic 方法

[英]Numpy-thonic way to set elements given un-ordered input and corresponding IDs

我有一个a值数组,以及一个与 a 长度相同的唯一 ID ids数组。

然后我有一个较小的值数组v和一个相应的 ID 数组v_ids ,它们必须覆盖 ID 匹配的a值。

小例子

例如:

a   = [0,1,2,4,4,2,0,0]
ids = [7,1,0,8,9,4,3,6] #unique ids
v = [-1,-2]
v_ids  = [4,8]

然后我会修改a给定的vv_ids为了获得

a   = [0,1,2, -2, 4, -1,0,0] # I set values of `a` with values of `v` when ids == 4 and 8 

低效的解决方案

下面是一个非 numpy-thonic 并且非常缓慢的方法来解决这个问题

def set_from_ids(a, ids, v, v_ids):
    result = np.array(a)
    for vid,value in zip(v_ids,v):
        index_of_vid_in_a = np.where(ids==vid)
        result[ index_of_vid_in_a ] = value
    return result


a   = np.array([0,1,2,4,4,2,0,0])
ids = np.array([7,1,0,8,9,4,3,6]) #unique ids
v = np.array([-1,-2])
v_ids  = np.array([4,8])

print(set_from_ids(a, ids, v, v_ids))

返回

[ 0  1  2 -2  4 -1  0  0]

实施 numpythonic 解决方案时的注意事项

请注意, idsv_ids数组都没有排序,这使得基于掩码的解决方案难以实现。

在给定无序输入和相应的唯一 ID 数组的情况下,设置元素的 numpy-thonic 方法是什么?

我不确定性能或效率,但您可以将 id 映射到 a 和 v 的值。然后使用 v_ids 映射更新主 id 映射。

a   = [0,1,2,4,4,2,0,0]
ids = [7,1,0,8,9,4,3,6] #unique ids
v = [-1,-2]
v_ids  = [4,8]

id_map = dict(zip(ids, a))
v_map = dict(zip(v_ids, v))
id_map.update(v_map)
print(list(id_map.values()))

输出

[0, 1, 2, -2, 4, -1, 0, 0]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM