【问题标题】:Replace first occurence of 0 in a 2D numpy array替换 2D numpy 数组中第一次出现的 0
【发布时间】:2022-01-14 00:09:34
【问题描述】:

我有一个二维数组:

[[1,2,0,0],
[4,0,9,4],
[0,0,1,0],
[4,6,9,0]]

有没有一种有效的方法(不使用循环)将数组中的每个第一个 0 替换为 1:

[[1,2,1,0],
[4,1,9,4],
[1,0,1,0],
[4,6,9,1]]

?

非常感谢!

【问题讨论】:

  • 您使用的是numpy.ndarray,还是您在上面发布的列表
  • 嗨,您尝试将其作为代码是什么?例如,你能检测到 0 吗?

标签: python numpy


【解决方案1】:

这是受this question 的公认答案启发的单行代码:

a = np.array([
    [1, 2, 0, 0],
    [4, 0, 9, 4],
    [0, 0, 1, 0],
    [4, 6, 9, 0]
])
a[range(len(a)), np.argmax(a == 0, axis=1)] = 1

【讨论】:

  • 如果一行中不存在 0,则更改数组中非零条目的风险。
【解决方案2】:

所以,你可以使用np.where来获取数组为0的行和列的索引:

In [45]: arr = np.array(
    ...:    [[1,2,0,0],
    ...:     [4,0,9,4],
    ...:     [0,0,1,0],
    ...:     [4,6,9,0]]
    ...: )

In [46]: r, c = np.where(arr == 0)

然后,使用np.unique 获取唯一的 x 值,这将对应于每行中0第一次 发生率,并使用return_index 获取索引以提取对应的列值:

In [47]: uniq_val, uniq_idx = np.unique(r, return_index=True)

In [48]: arr[uniq_val, c[uniq_idx]] = 1

In [49]: arr
Out[49]:
array([[1, 2, 1, 0],
       [4, 1, 9, 4],
       [1, 0, 1, 0],
       [4, 6, 9, 1]])

如果性能真的是个问题,你可以写一个numba 函数,我怀疑这对numba 来说非常适合

【讨论】:

    猜你喜欢
    • 2020-11-26
    • 2023-03-12
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2019-01-07
    • 2014-01-28
    相关资源
    最近更新 更多