我有一个numpy数组,我想用第二个数组中的数据更新其中的一列值。有点像excel中的vlookup函数。
需要在a
表格中查找b
的第一列。然后将a
中的第二列替换为b
中第二列中的数字。
import numpy as np
# type, newval
a = np.array( [[1, 23, 0],
[2, 24, 0],
[1, 15, 0],
[1, 27, 0],
[6, 22, 0],
[1, 18, 0]]
)
# type, newval
b = np.array([[1, 1.1],
[2, 2.1],
[3, 3.1],
[4, 4.1],
[5, 5.1],
[6, 6.1]]
)
a[:,2] = np.where(b[:,0] == a[:,0], b[:,1], None)
预期结果
注意:我希望使用查找值更新原始数组a
。
a = array( [[1, 23, 1.1],
[2, 24, 2.1],
[1, 15, 1.1],
[1, 27, 1.1],
[6, 22, 6.1],
[1, 18, 1.1]]
)
然而,我得到的是nan
除了数组中的最后4个项目。它喜欢我的np.where
条件正在替换位置和数字正确的值,而不仅仅是数字匹配的位置。
答案 0 :(得分:2)
您可以将数组b
转换为字典。
之后,可以通过列表理解来存档所需的结果。
b_as_dict = dict(b)
res = [[k, b_as_dict[k]] for k in a[:,0]]
关于将这些结果插入a
:
目前a
是一个整数数组。要将这些结果导入a
,您可能希望将其定义为float
或float32
(因为您尝试插入的值是浮点数):
a = np.array([[1, 23, 0],
[2, 24, 0],
[1, 15, 0],
[1, 27, 0],
[6, 22, 0],
[1, 18, 0]],
dtype=np.float32)
然后你可以像Zinjaai建议的那样使用列表推导:
a[:, 2] = [b_as_dict[k] for k in a[:, 0]]
答案 1 :(得分:1)
如果b被分类并连续,那么简单的解决方案是:
In [19]: b[a[:,0]-1]
Out[19]:
array([[ 1. , 1.1],
[ 2. , 2.1],
[ 1. , 1.1],
[ 1. , 1.1],
[ 6. , 6.1],
[ 1. , 1.1]])
或者,有点慢:
In [20]: a[:,0]
Out[20]: array([1, 2, 1, 1, 6, 1])
通过减法1,这些是我们的数组b
In [21]: a[:,0]-1
Out[21]: array([0, 1, 0, 0, 5, 0])
现在我们只是从b
读取这些行。