将数组值添加到标识符与其他数组匹配的 numpy recarray
Add array values to numpy recarray where identifier matches with other array
我正在尝试根据其中一列中的标识符字符串将一个重新排列 (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])
我通过根据 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')])
我正在尝试根据其中一列中的标识符字符串将一个重新排列 (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])
我通过根据 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')])