Python 基于where条件向numpy数组添加列

Python 基于where条件向numpy数组添加列,python,arrays,numpy,Python,Arrays,Numpy,我有一个numpy数组,我想用第二个数组中的数据更新其中的一列值。有点像excel中的vlookup函数 需要在b表中查找a的第一列。然后将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,

我有一个numpy数组,我想用第二个数组中的数据更新其中的一列值。有点像excel中的vlookup函数

需要在
b
表中查找
a
的第一列。然后将
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]]
          )

然而,我得到的是数组中最后4项旁边的
nan
。它就像我的
np一样。其中
条件是替换位置和数字正确的值,而不仅仅是数字匹配的值。

如果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
中读取这些行,如果b是排序且连续的,那么simples解决方案是:

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)
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
中读取这些行,就可以将数组
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)
之后,可以通过列表理解来归档所需的结果

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

关于将这些结果插入
a

当前
a
是一个整数数组。要将这些结果放入
a
中,您可能需要将其定义为
float
float32
(因为您尝试插入的值是float):

然后,您可以使用Zinjaai建议的列表理解:

a[:, 2] = [b_as_dict[k] for k in a[:, 0]]

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

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

关于将这些结果插入
a

当前
a
是一个整数数组。要将这些结果放入
a
中,您可能需要将其定义为
float
float32
(因为您尝试插入的值是float):

然后,您可以使用Zinjaai建议的列表理解:

a[:, 2] = [b_as_dict[k] for k in a[:, 0]]

注意,
b
数组可以是一个列表或任何其他类型的对象,如果它使事情变得更简单的话。
a
数组是从文件中读入的,因此我不想更改该数组的结构。您确定“预期结果”是正确的吗?在第二行,第二列中,我希望是2.1。第5行和第6行好像互换了。Zinjaai,是的,你是对的。我已经把它修好了。谢谢。注意,
b
数组可以是一个列表或任何其他类型的对象,如果它使事情变得更容易的话。
a
数组是从文件中读入的,因此我不想更改该数组的结构。您确定“预期结果”是正确的吗?在第二行,第二列中,我希望是2.1。第5行和第6行好像互换了。Zinjaai,是的,你是对的。我已经把它修好了。谢谢。可能是重复的谢谢。有没有办法将这些结果放入原始数组?问题是,
a
中的列比我上面给出的示例中显示的要多。谢谢。有没有办法将这些结果放入原始数组?问题是,
a
中的列比我上面给出的示例中显示的要多。我也喜欢这个解决方案。如果查找表
b
可以用这种方式排序,可能会更快。我也喜欢这种解决方案。如果查找表
b
可以用这种方式排序,它可能会更快。