根据where条件将列添加到numpy数组

时间:2014-09-28 09:01:51

标签: python arrays numpy

我有一个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条件正在替换位置和数字正确的值,而不仅仅是数字匹配的位置。

2 个答案:

答案 0 :(得分:2)

您可以将数组b转换为字典。 之后,可以通过列表理解来存档所需的结果。

b_as_dict = dict(b)
res = [[k, b_as_dict[k]] for k in a[:,0]]

关于将这些结果插入a

目前a是一个整数数组。要将这些结果导入a,您可能希望将其定义为floatfloat32(因为您尝试插入的值是浮点数):

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读取这些行。