[英]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
给定的v
和v_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]
请注意, ids
和v_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.