Numpy数组:高效查找匹配索引,但可能缺少相应值

fwzugrvs  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(79)

我有一个非常类似于this post的问题。本质上,我从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]]

[3,2]从数组 a 和[7,80]将被忽略数组 b。第二,作为一个单独的函数,我想以类似的方式连接这两个数组,但是每当找不到匹配的值时,我想用np.nan(或其他一些唯一的非数值填充符)创建一个新行

[[1  2      10]
 [3  2      np.nan]
 [5  0      20]
 [6  4      30]
 [7  np.nan 80]]

我有两个程序可以做这些事情,但它们效率不高,因为它们会遍历输入数组的每一行(可能宽度不同),有效地按情况将行“压缩”在一起。
有没有很好的有效方法可以用内置的numpy函数来做到这一点?

voj3qocg

voj3qocg1#

下面是一个如何使用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.]]

相关问题