【问题标题】:Numpy tables - how to iterate over a large table with steps of smaller table chunksNumpy 表 - 如何使用较小表块的步骤迭代大表
【发布时间】:2021-12-31 01:38:57
【问题描述】:

我有一个 2d numpy 数组,其形状为 - (20,1200),例如24000 像素,值为零和一。 我想用 (4,60) 的块进行迭代,并将每个块的百分比相加,意思是 - ((number_of_ones)/240)*100。 结果应注入新的 numpy 表(5X20),因为每个单元格代表原始表的(4X60)。 目前,我正在使用 2 个嵌套的 for 循环,但这需要时间而不是最佳实践。

final_seg = []
for i in range(0, 20, 4):
        for j in range(0, 1200, 60):
            # slice segment from table
            data = big_table[i:i + 4, j:j + 60]
            n_zeros = np.count_nonzero(data == 1)
            final_seg.append((n_zeros/240) * 100)
return final_seg

numpy 命令的等价物是什么?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    相当高效的解决方案是创建初始数组块的临时 4 维视图,并为其两个轴应用 np.count_nonzero

    window = (4, 60) 
    shape = (big_table.shape[0]//window[0], window[0], big_table.shape[1]//window[1], window[1])
    out = np.count_nonzero(big_table.reshape(shape), axis=(1, 3))
    

    【讨论】:

    • 绝妙的解决方案。它完美地工作。 @mathfux 你能解释一下在这种情况下轴(1,3)是如何工作的吗?
    • @CSstudent 在这个问题上花了很长时间,我仍然无法完全理解这个过程。几天前我打开了a related question。您可能会发现更多关于使用 np.reshapeaxis=(1, 3) 上的任何 1D 到 0D(矢量到标量)操作的详细信息。等搞清楚了我会回来给你答案的。
    猜你喜欢
    • 2015-04-27
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2021-01-11
    • 2021-10-06
    相关资源
    最近更新 更多