我正在尝试在两个 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]
我不确定我是否很好地理解了你的问题,但你可以使用
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]