【问题标题】:Counting non zeros in only 1 column of a numpy array仅在 numpy 数组的 1 列中计算非零
【发布时间】:2013-12-23 18:52:38
【问题描述】:

我有一个如下创建的 Numpy 数组

data=np.zeros(500,dtype='float32, (50000,2)float32')

这个数组填充了我从一些测量中获得的值,并且应该反映在每个时间点(500 个时间点的空间)我们可以获得 50.000 个 x 和 y 坐标。

稍后在我的代码中使用类似bisect 的搜索,我需要知道我最初使用np.count_nonzero(data) 所做的数组中实际上有多少X 坐标(测量点),这产生了以下问题:

Fake data:

1 1
2 2
3 0
4 4
5 0
6 6
7 7
8 8
9 9
10 10

这里的非零计数返回 18 个值,然后代码进入类似 bisect 的搜索,使用 data[time][1][0][0] 作为最小 X 坐标和 data[time][1][(np.count_nonzero(data)][0] 作为最大 X 坐标,导致数组停止在 9而不是 10。

我可以使用 while 循环手动计算数组中的非零值(在 X 坐标列中),但这很愚蠢,我假设有一些内置的 numpy 功能。我的问题是我需要什么内置功能或修改我的np.count_nonzero(data),因为文档没有提供太多这方面的信息(link 到 numpy doc)。

-- 简化问题--

我可以使用 Numpy 功能仅计算单数列的非零值吗? (即在data[time][1][0][0]data[time][1][max][0] 之间)

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    也许更好的方法是使用nonzero 过滤数组并迭代结果:

    nonZeroData = data[np.nonzero(data[time][1])]
    

    仅从第二列计算零:

    nonZeroYCount = np.count_nonzero(data[time][1][:, 1])
    

    【讨论】:

    • 这不会产生完全相同的问题并跳过所有为 0 的 Y 坐标吗?
    • 不确定我是否理解您的问题。 nonzero 的目的是跳过 0 元素——这不是你想要的吗?如果您的条件更详细,您可以使用where
    • 我需要保留 X 坐标具有正常值但 Y 坐标为 0 的所有数据点。我使用的方法(我认为这也适用于您建议的方法)然后会跳过空的 Y 坐标,而我需要非零 X 坐标的数量。 (所以data[time][1][0:unknown][0]中的那些人)
    • 你答案的第二部分 c(sh) 确实是我正在寻找的东西,我会尝试一下。
    【解决方案2】:

    如果我理解正确,选择从data[time][1][0][0]data[time][1][max][0] 的元素:

    data[time][1][:max+1,0]
    

    编辑

    每次都计数非零:

    (data["f1"][:,:,0] != 0).sum(1)
    

    【讨论】:

    • 如果我的操作正确,不需要max+1np.count_nonzero(data[time][1][:,0])就是他想要的
    • @alko 你是对的,我最终使用了 BartoszKP 的答案进行修改。
    • @BasJansen,我添加了一个方法,可以在没有 for 循环的情况下每次都将所有非零计数。这对你有用吗?
    【解决方案3】:

    为什么不考虑使用data != 0 来获取bool 矩阵?

    你可以使用:

    stat = sum(data != 0) 统计非零条目。

    我不确定您的 data 数组的形状是什么,但希望您能明白我的意思。 :)

    【讨论】:

    • 问题是如何不按照您的建议去做,因为这会导致完全相同的问题。如果可能的话,我还希望留在 numpy 库中,因为它必须计算一个 numpy 数组。
    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2014-06-08
    • 1970-01-01
    • 2017-08-12
    相关资源
    最近更新 更多