【问题标题】:Calculate The Extent Of Non-Zero Values In An Array计算数组中非零值的范围
【发布时间】:2018-03-23 03:52:13
【问题描述】:

假设我有一个二维 numpy 数组A,我如何计算第一个非零 x 元素和最后一个非零 x 元素之间的元素数。到目前为止,我正在使用

计算第一个非零元素的索引位置
import numpy as np
A = np.array([[0, 0, 3],[0, 4, 2],[0, 7, 0],[0, 0, 0]])
for row in range(np.size(A,1)):
    if A[:,row].any():
        xMin = row
        break
print(xMin)

然后我可以从数组末尾开始对xMax 执行类似的操作并计算差异。该数组代表一块板,我想找到板上项目的范围/范围。我想知道是否可以使用np.nonzero() 来查找非零元素或剥离非零元素数组。最简单的想法是遍历板的所有元素并跟踪xMinxMax,但是有没有更有效的方法来做到这一点?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    是的,您可以使用np.nonzero() 来完成。第一项是非零项的第一次出现,最后一项是最后一次出现。然后你可以使用你的数组的形状(行的长度)来计算它们之间的项目数。

    In [56]: x, y = A.shape
    
    In [57]: (s, *rest, l),(ss, *rest, ll) = np.nonzero(A)
    
    # without counting start and end
    In [58]: (l - s) * y - (ss - ll) - 1
    Out[58]: 4
    
    # Counting start and end 
    In [59]: (l - s) * y - (ss - ll) + 1
    Out[59]: 6
    

    【讨论】:

    • 对不起,我不明白你在做什么,这个数组的非零元素的行和列的范围应该分别是 2 和 3。我不明白数字 4 和 6 代表什么。但是看看你的代码,我想我现在已经明白了,这有效 yCoords,xCoords = np.nonzero(A) deltaY = np.ptp(yCoords)+1 deltaX = np.ptp(xCoords)+1
    • @s3nt1n3lz 你的意思是你不想数零?
    • 好的我明白你现在在做什么,我应该更清楚。那并非我的本意。非零元素在 4x3 数组中占据 3x2 块,其中包括 2 个零,因此答案是 3 和 2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 2012-03-22
    • 2019-11-07
    相关资源
    最近更新 更多