将数组值添加到标识符与其他数组匹配的 numpy recarray

Add array values to numpy recarray where identifier matches with other array

我正在尝试根据其中一列中的标识符字符串将一个重新排列 (in_arr) 的值分配给另一个重新排列 (out_arr)。要正确分配值,id 中的字符串必须匹配。

一些约束:

这是一些代码:

my_dtype = [('id', 'S3'), ('val', int)]
in_arr = np.array([('xyz', 1), ('abc', 2), ('abc', 2)], dtype=my_dtype)
out_arr = np.array([('abc', 0), ('asd', 0), ('qwe', 0), ('xyz', 0), ('def', 0)], dtype=my_dtype)

msk_in, msk_out = ... # some magic
out_arr[msk_out]['val'] = in_arr[msk_in]['val']    # <-- other ways to assign also work for me...

out_arr
array([(b'abc', 2), (b'asd', 0), (b'qwe', 0), (b'xyz', 1), (b'def', 0)],
      dtype=[('id', 'S3'), ('val', '<i8')])

最接近的,我来替换我的“魔法部分”是借用。但这只给我正确的索引,而不是正确的顺序。

np.where(np.isin(out_arr['id'], in_arr['id']))[0]
array([0, 3])

我通过根据 id 值对数组进行排序解决了我的问题。 这需要先删除 in_arr 中的重复项。

# remove duplicates
in_arr = in_arr[np.unique(in_arr['id'], return_index=True)[1]]

# sort both arrays to match the first len(in_arr) elements
out_arr = np.array(sorted(out_arr, key=lambda x: (np.isin(x['id'], in_arr['id']), x['id']), reverse=True))
in_arr[::-1].sort(order='id')

# assign values and test
out_arr['val'][:len(in_arr)] = in_arr['val'] 
out_arr
array([(b'xyz', 1), (b'abc', 2), (b'qwe', 0), (b'def', 0), (b'asd', 0)],
      dtype=[('id', 'S3'), ('val', '<i8')])