【问题标题】:Adding column to numpy array based on where condition根据 where 条件将列添加到 numpy 数组
【发布时间】:2014-09-28 09:01:50
【问题描述】:

我有一个 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]]
          )

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

【问题讨论】:

  • 注意,b 数组可以是列表或任何其他类型的对象,如果它使事情变得更容易的话。 a 数组是从文件中读取的,所以我不想改变它的结构。
  • 你确定你的“预期结果”是正确的吗?在第二行第二列中,我期望 2.1。第 5 行和第 6 行似乎互换了。
  • Zinjaai,是的,你是对的。我已经在上面修复了。谢谢。

标签: python arrays numpy


【解决方案1】:

您可以将数组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]]

【讨论】:

  • 谢谢。有什么方法可以将这些结果放入原始数组中?问题是,a 中的列比我上面给出的示例中显示的要多。
【解决方案2】:

如果 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 可以按这种方式排序,它可能会更快。
猜你喜欢
  • 2021-01-24
  • 1970-01-01
  • 2023-03-13
  • 2019-07-17
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 2014-03-05
相关资源
最近更新 更多