【问题标题】:Find and replace specific values within 2D array [closed]在二维数组中查找和替换特定值 [关闭]
【发布时间】:2018-10-17 23:02:17
【问题描述】:

我有一个大型二维数组array,每个条目都是一个大型数字数组 :

array = [
            [1, 0, 3, ...],
            [5, 4, 1, ...],
            [1, 2, 3, ...],
            ...
        ]

二维数组中的所有数字都是从 0 到 5,我必须以某种方式找到并替换特定数字,例如,所有出现的数字 3 并将其替换为 5

谢谢

【问题讨论】:

  • 你能提供一个minimal reproducible example吗?
  • 正如您所说的“特定数字”,您搜索超过 1 个数字是否正确?你知道这些数字是多少吗?
  • 是的,数组中唯一的数字是从 0 到 5,所以我必须用 -5 替换 1,用 -3 替换 2,用 1 替换 3,用 3 替换 4,用 5 替换 5跨度>
  • 这个问题我好像不太清楚。

标签: python python-3.x multidimensional-array


【解决方案1】:

这可以通过列表理解在一个简单的单行中完成。

假设你有一个列表列表:

a = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]

并且您想将所有出现的2 替换为4

[[_el if _el != 2 else 4 for _el in _ar] for _ar in a]

另一种选择是使用 numpy 的 where 函数。来自文档字符串:

where(条件, [x, y])

xy 返回元素,具体取决于condition

所以,在您的情况下(假设您想再次将所有 2 替换为 4):

import numpy as np

a = np.array([[1, 2, 3],
   [1, 2, 3],
   [1, 2, 3]])

np.where(a==2, 4, a)

如果您想一次性替换多个值,您可以执行以下操作: 假设您想将 1 替换为 3 并将 3 替换为 5

ix=np.isin(array, [1,3])
vc=np.vectorize(lambda x: 3 if x == 1 else 5)
np.where(ix, vc(array), array)

如果您要替换的值超过 2 个,假设您要将列表 [1,3,5] 映射到 [3, 5, -3],那么您可以定义一个简单的函数,例如:

old_vals = [1,3,5]
new_vals = [3, 5, -3]
def switch_val(x):
    return new_vals[old_vals.index(x)] if x in old_vals else x

等等:

vc=np.vectorize(switch_val)
vc(array)

我们在哪里vectorized 函数。

希望对您有所帮助并祝您编码愉快!

【讨论】:

  • 只是好奇,鉴于 OP 想要替换多个值,我猜最 Pythonic 的方法是多次使用 np.where ......?而不是使用一堆条件和/或 elifs?
  • @NathanThomas 很抱歉这个小丑。我将其添加到答案中。 :)
  • 我只是好奇,但结果证明它非常优雅。很高兴看到完整的工作示例以供将来使用!
  • @NathanThomas 不客气!
【解决方案2】:
for i in range(len(array)):
    for j in range(len(array[i])):
        if array[i][j] == value_you_are_looking_for:
            array[i][j] = new_value

这应该可以工作

【讨论】:

  • 谢谢,我试过这个表格,但由于某种原因它不起作用,它只是打印了完全相同的数组 for i in range(len(new_set)): for j in range(len(new_set[ i])): 如果 new_set[i][j] == 1: new_set[i][j] = -5 print(new_set)
【解决方案3】:

对于单个值,假设您有一个名为 Arr 的数组,这样:

Arr = np.array([[1,2,3],
                [1,2,3],
                [1,2,3]])

然后:

mask = Arr == 2

给予:

mask = np.array([[False,True,False],
                [False,True,False],
                [False,True,False]])

最后,将 2 替换为 4:

newArr[mask] = 4

给予:

Arr = np.array([[1,4,3],
                [1,4,3],
                [1,4,3]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2012-05-13
    • 2022-01-02
    • 1970-01-01
    • 2023-01-24
    • 2015-04-26
    • 2021-08-22
    相关资源
    最近更新 更多