gpt4 book ai didi

python - 将每行的最后一个非零元素设置为零 - NumPy

转载 作者:太空宇宙 更新时间:2023-11-03 14:09:35 27 4
gpt4 key购买 nike

我有一个数组 A:

A = array([[1, 2, 3,4], [5,6,7,0] , [8,9,0,0]])

我想把每一行的最后一个非零值改成0

A = array([[1, 2, 3,0], [5,6,0,0] , [8,0,0,0]])

如何为任何 n*m numpy 数组编写代码?谢谢,S ;-)

最佳答案

方法 #1

一种基于cumsumargmax 的方法 -

A[np.arange(A.shape[0]),(A!=0).cumsum(1).argmax(1)] = 0

sample 运行-

In [59]: A
Out[59]:
array([[2, 0, 3, 4],
[5, 6, 7, 0],
[8, 9, 0, 0]])

In [60]: A[np.arange(A.shape[0]),(A!=0).cumsum(1).argmax(1)] = 0

In [61]: A
Out[61]:
array([[2, 0, 3, 0],
[5, 6, 0, 0],
[8, 0, 0, 0]])

方法 #2

还有一个基于 argmax 并且希望更高效 -

A[np.arange(A.shape[0]),A.shape[1] - 1 - (A[:,::-1]!=0).argmax(1)] = 0

解释

argmax 的用途之一是获取 max 元素沿数组轴第一次出现的 ID。在第一种方法中,我们沿行获取 cumsum 并获取第一个最大 ID,它表示最后一个非零元素。这是因为剩余元素上的 cumsum 不会增加最后一个非零元素之后的总和值。

让我们以更详细的方式重新运行该案例 -

In [105]: A
Out[105]:
array([[2, 0, 3, 4],
[5, 6, 7, 0],
[8, 9, 0, 0]])

In [106]: (A!=0)
Out[106]:
array([[ True, False, True, True],
[ True, True, True, False],
[ True, True, False, False]], dtype=bool)

In [107]: (A!=0).cumsum(1)
Out[107]:
array([[1, 1, 2, 3],
[1, 2, 3, 3],
[1, 2, 2, 2]])

In [108]: (A!=0).cumsum(1).argmax(1)
Out[108]: array([3, 2, 1])

最后,我们使用 fancy-indexing 将它们用作列索引以在 A 中设置适当的元素。

在第二种方法中,当我们在 bool 数组上使用 argmax 时,我们只是得到了 True 的第一次出现,我们在行翻转版本上使用了它输入数组。因此,我们将拥有原始顺序中的最后一个非零元素。其余的想法是一样的。

关于python - 将每行的最后一个非零元素设置为零 - NumPy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39959435/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com