如何将数组中的所有负数替换为零

3
如果我有一个NxN的numpy数组,并且在任何位置上都有一个负数,那么有没有一种简单快捷的方法可以将该数字替换为0?类似于:
for item in array:
    if item <= 0: 
        item = 0

@EdChum...这并没有什么区别,因为你最终会用0替换0。唯一的区别可能是如果数组有浮点数,并且一些0带有“负号”,而其他一些带有正号,通过分配0,您将所有这些数字都设置为“正号”,但我相信所有操作应该都是相同的。 - Bakuriu
@Bakuriu 没错,但是在 <0<=0 之间存在语义差异。无论最终结果如何,负数语句明确表示 <0 表示负数,而 <=0 则不表示。 - EdChum
提供的代码有什么问题吗?(我从未使用过numpy,所以可能问了一个愚蠢的问题) - WhatsThePoint
@WhatsThePoint 这不是矢量化的,而且如果你有一个大数组,那么在这种情况下你最有效的设置元素为0的方法就是遍历每一行,而使用掩码将以矢量化的方式设置整个数组。 - EdChum
@EdChum 干杯。 - WhatsThePoint
显示剩余2条评论
2个回答

7
您可以使用布尔掩码来屏蔽整个数组,这比您目前使用的迭代方式要高效得多。请注意保留HTML标记。
In [41]:
array = np.random.randn(5,3)
array

Out[41]:
array([[-1.09127791,  0.51328095, -0.0300959 ],
       [ 0.62483282, -0.78287353,  1.43825556],
       [ 0.09558515, -1.96982215, -0.58196525],
       [-1.23462258,  0.95510649, -0.76008193],
       [ 0.22431534, -0.36874234, -1.46494516]])

In [42]:
array[array < 0] = 0
array

Out[42]:
array([[ 0.        ,  0.51328095,  0.        ],
       [ 0.62483282,  0.        ,  1.43825556],
       [ 0.09558515,  0.        ,  0.        ],
       [ 0.        ,  0.95510649,  0.        ],
       [ 0.22431534,  0.        ,  0.        ]])

2

根据这个SO答案,您可以使用numpy的内置索引来实现此目的。

arr[arr < 0] = 0

1
这个答案和我的有什么不同? - EdChum
我在发布我的回答时没有看到你的回答。我不会删除我的回答,因为它添加了一些新的内容,其中包含解释和基准测试的参考资料。不过不用担心,我已经给你的回答点赞了,而且我认为它应该被选为最佳答案,因为它是第一个回答的。 - lucasnadalutti
只要它添加了新的内容,我对重复答案没有问题,如果您将相关部分添加到您的答案中而不仅仅是一个链接,那就更好了,这只是一种观察。 - EdChum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接