0

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

一些限制:

  • 中的元素数量in_arr可以小于或大于中的数量out_arr
  • 中的每个标识符in_arr都表示在中out_arr,不一定相反
  • 如果数字in_arr更大,条目将重复,并且可以分配其中任何一个
  • 中的每个标识符out_arr都是唯一的
  • 结果的元素顺序无关紧要
  • 我宁愿不循环遍历每个元素;-)

这是一些代码:

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])
4

1 回答 1

0

我通过根据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')])
于 2020-11-20T10:00:22.040 回答