两个具有重复值的 Numpy 数组之间的快速索引映射

问题描述 投票:0回答:1

我正在尝试在两个 Numpy 数组之间编写连接操作,并惊讶地发现 Numpy 的

recfunctions.join_by
不处理重复值。

我采取的方法是使用要连接的列并找到它们之间的索引映射。从网上看,大多数仅使用 Numpy 的解决方案都面临着无法处理重复项的相同问题(您将在代码部分中看到我的意思)。

我希望完全留在 Numpy 库中,如果可能的话,可以利用向量化操作,所以理想情况下没有本机 Python 代码、Pandas(出于其他原因)或 numpy 索引。

以下是我看过的几个问题:

在 numpy 中将一个数组映射到另一个数组的方法? 查找两个 numpy 数组之间的索引映射 Numpy:对于一个数组中的每个元素,找到另一个数组中的索引 两个排序部分重叠的 numpy 数组之间的索引映射

例如,数组

X
Y
分别使用每个数组
x
y
中的列进行连接。

映射定义为,

f
就是我所追求的

mapping = f(x, y)

x = y[mapping]

举个例子,

x = np.array([1,1,2,100])
y = np.array([1,2,3,4,5,6,7])


mapping = [0, 0, 1, -] # '-' indicates masked
x = y[mapping] 

通过在线查看类似问题,找到从

x
y
的映射,其中
np.where(np.isin(x,y))
可以消除重复值。还有
np.searchsorted(x,y)
根本不处理
x
中的重复项。我想知道是否还有其他可以做的事情。

由于

x

中存在重复,因此以下映射不正确
import numpy as np

x = np.array([1,1,2,100])
y = np.array([1,2,3,4,5,6,7])

mapping = np.searchsorted(x, y)
# [0 2 3 3 3 3 3]

这也不是正确的映射,因为映射需要与

x
具有相同的长度。

import numpy as np

x = np.array([1,1,2,100])
y = np.array([1,2,3,4,5,6,7])

mapping = np.where(np.isin(x, y))[0]
# [0, 1, 2]
python numpy numpy-ndarray
1个回答
0
投票

我不确定我是否很好地理解了你的问题,但你可以使用

np.searchsorted
和相反的参数:

import numpy as np

x = np.array([1, 1, 2, 100])
y = np.array([1, 2, 3, 4, 5, 6, 7])

mapping = np.searchsorted(y, x)
mapping[mapping >= len(y)] = -1  # -1 to indicate "masked" values

print(mapping)

打印:

[ 0  0  1 -1]
© www.soinside.com 2019 - 2024. All rights reserved.