代码之家  ›  专栏  ›  技术社区  ›  royal grasshopper

为什么numpy.fip()在不改变其精度和形状的情况下减少numpy数组的内存大小

  •  0
  • royal grasshopper  · 技术社区  · 2 年前

    我编写了一个函数,将序列数据转换为稀疏矩阵。我惊讶地发现 img = np.flip(img, axis = 0) 将矩阵存储器的大小从1928减小到128。

    此外,无论我如何增加时间窗口的长度(稀疏矩阵的宽度),最终翻转矩阵的内存大小始终为128。

    我以为 np.flip() 只创建了原始矩阵的视图,这意味着内存大小应该更改,所以我不明白为什么会发生这种情况。

    函数如下所示

    def gen_img(df, index, interval, height):
        df = df[index-interval+1: index+1, :5]
        max_price = df[:, 1].max()
        min_price = df[:, 2].min()
        if max_price == min_price:
            return df, np.zeros((height, interval * 3), dtype="float32")
        else:
            df[:, :4] = np.around((height * 4 / 5) * (df[:, :4] - min_price) / (max_price - min_price) + height / 5)
            df[:, 4] = np.around(df[:, 4].astype("float32") * height / 5 / df[:, 4].max())
            df = df.astype(int)
            img = np.zeros((height, interval * 3), dtype="float32")
            print("check zero matrix size: {}".format(sys.getsizeof(img)))
            for i in range(interval):
                img[df[i, 0], i*3] = 1.0
                print("check intermed1 matrix size: {}".format(sys.getsizeof(img)))
                img[df[i, 3], i*3 + 2] = 1.0
                img[df[i, 2] : df[i, 1] + 1, i*3 + 1] = 1.0
                img[0 : df[i, 4] + 1, i*3 + 1] = 1.0
            print("check intermed2 matrix size: {}".format(sys.getsizeof(img)))
            img = np.flip(img, axis = 0)
            print("check generated matrix size: {}".format(sys.getsizeof(img)))
    
        return df, img
    

    这是调试打印结果

    check zero matrix size: 1928, dtype: float32, shape: (30, 15)
    check intermed1 matrix size: 1928, dtype: float32, shape: (30, 15)
    check intermed1 matrix size: 1928, dtype: float32, shape: (30, 15)
    check intermed1 matrix size: 1928, dtype: float32, shape: (30, 15)
    check intermed1 matrix size: 1928, dtype: float32, shape: (30, 15)
    check intermed1 matrix size: 1928, dtype: float32, shape: (30, 15)
    check intermed2 matrix size: 1928, dtype: float32, shape: (30, 15)
    check generated matrix size: 128, dtype: float32, shape: (30, 15)
    
    0 回复  |  直到 2 年前