我有一个与这篇文章非常相似的问题。本质上,我从 2 个 2d 数组(可能具有不同的宽度)开始,其中有一堆行,其中最左边的列充当有效索引,我想组合这两个数组(与原始帖子不同,我们可以假设最左边的列是已经按升序排列)
a = np.array([[1,2], [5,0], [6,4]])
b = np.array([[1,10], [5,20], [6,30]])
将合并到此
[[1 2 10]
[5 0 20]
[6 4 30]]
与原始端口一样。然而,我想做两件新的事情。首先,我想通过最左边的值来匹配两个数组,删除另一个数组上没有匹配值的任何行。 举个例子,
a = np.array([[1,2],[3,2], [5,0], [6,4]])
b = np.array([[1,10],[6,30], [5,20], [7,80]])
仍然是
[[1 2 10]
[5 0 20]
[6 4 30]]
数组 a 中的 [3,2] 和数组 b 中的 [7,80] 将被忽略。 其次,作为一个单独的函数,我想以类似的方式连接这两个数组,但每当找不到匹配的值时,我想使用 np.nan (或其他一些独特的非数字填充符)创建一个新行
[[1 2 10]
[3 2 np.nan]
[5 0 20]
[6 4 30]
[7 np.nan 80]]
我有两个程序可以执行这些操作,但它们效率不高,因为它们迭代输入数组的每一行(可能具有不同的宽度),有效地将行按大小写“压缩”在一起。
有没有好的有效方法可以使用内置 numpy 函数来做到这一点?
这是一个如何使用 pandas 进行操作的示例:
import pandas as pd
a = np.array([[1, 2], [3, 2], [5, 0], [6, 4]])
b = np.array([[1, 10], [6, 30], [5, 20], [7, 80]])
out = pd.DataFrame(a).merge(pd.DataFrame(b), on=[0], how="inner").to_numpy()
print(out)
打印:
[[ 1 2 10]
[ 5 0 20]
[ 6 4 30]]
对于第二个示例,选择
how="outer"
:
out = pd.DataFrame(a).merge(pd.DataFrame(b), on=[0], how="outer").to_numpy()
print(out)
打印:
[[ 1. 2. 10.]
[ 3. 2. nan]
[ 5. 0. 20.]
[ 6. 4. 30.]
[ 7. nan 80.]]