【问题标题】:Replace elements in numpy array using list of old and new values使用旧值和新值列表替换 numpy 数组中的元素
【发布时间】:2015-07-09 21:37:53
【问题描述】:

我想使用旧值和新值列表替换 numpy 数组中的元素。请参阅下面的代码示例(replace_old 是请求的方法)。该方法必须适用于 int、float 和 string 元素。我该怎么做?

import numpy as np

dat = np.hstack((np.arange(1,9), np.arange(1,4)))
print dat # [1 2 3 4 5 6 7 8 1 2 3]

old_val = [2, 5]
new_val = [11, 57]

new_dat = replace_old(dat, old_val, new_val)
print new_dat # [1 11 3 4 57 6 7 8 1 11 3]

【问题讨论】:

  • 我想,最佳答案很大程度上取决于所涉及数组的典型大小。你有什么迹象吗?
  • 不是真的,可能大约 100 万次观察。但是,性能并不是那么关键。

标签: python arrays numpy


【解决方案1】:

你可以使用np.place

>>> np.place(dat,np.in1d(dat,old_val),new_val)
>>> dat
array([ 1, 11,  3,  4, 57,  6,  7,  8,  1, 11,  3])

要创建 mask 数组,您可以使用np.in1d(arr1,arr2),这将为您提供:

与 ar1 长度相同的布尔数组,如果 ar1 的元素在 ar2 中,则为 True,否则为 False

编辑:请注意,前面的配方将根据这些顺序替换old_values,并且正如@ajcr 所说,它不适用于其他数组,所以作为现在的一般方法,我建议以下方法使用循环(我认为这不是最好的方法):

>>> dat2 = np.array([1, 2, 1, 2])
>>> old_val = [1, 2]
>>> new_val = [33, 66]

>>> z=np.array((old_val,new_val)).T
>>> for i,j in z:
...    np.place(dat2,dat2==i,j)
... 
>>> dat2
array([33, 66, 33, 66])

在这种情况下,您创建一个新数组 (z),其中包含来自 old_valnew_val 的相关对,然后您可以将它们传递给 np.place 并替换它们。

【讨论】:

  • 不错的numpythonic解决方案;我希望这对于除微型阵列之外的所有阵列都接近最佳。但是,涉及 np.put 的解决方案可能仍然稍微更有效,因为它避免了完整掩码数组的分配和迭代。
  • @EelcoHoogendoorn 是的,但是由于np.put 需要为每个元素细化相关索引并且完成这项工作可能并不容易,我认为在这里使用np.place 更合适!
  • 小心:这不会像你期望的那样工作。试试dat = [1, 2, 1, 2]old_val = [1, 2]new_val = [33, 66]。此方法返回[33, 66, 33, 33]。数组的最后一个元素没有被正确替换。
  • @ajcr 看来你是对的,让我解决这个问题!感谢关注!
  • @Kasra:我阅读了 OP 的问题,希望将每个 1 替换为 33,并将每个 2 替换为 66。我非常喜欢你建议的方法,但它并不完全以这种方式工作。 (如果我错了,这是 OP 想要的,我会很乐意删除评论。)
猜你喜欢
  • 1970-01-01
  • 2012-11-14
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 2013-09-11
  • 1970-01-01
  • 2010-12-10
相关资源
最近更新 更多