gpt4 book ai didi

python - 压缩数组(在 Python 中)比具有一维条目的数组小吗? ([x,y] 与 [x,y,1]?)

转载 作者:行者123 更新时间:2023-11-30 22:19:13 31 4
gpt4 key购买 nike

当尝试让代码使用不同的框架和源工作时,我多次偶然发现了这一点:

Python Numpy 数组 AB 内容相同,但其中一个具有 A.shape == [x, y] 和另一个B.shape == [x, y, 1]。通过多次处理,我知道我可以用squeeze解决这个问题。 :

A == numpy.squeeze(B)

但目前我必须重新设计许多由于这方面的“不一致”数组而出错的代码(一些图像带有 len(img.shape) = 2 [1024, 1024 ] 以及一些带有 len(img.shape) = 3 的图像 [1024, 1024, 1]

现在我必须选择一个,我倾向于[1024, 1024, 1],但由于这段代码应该具有内存效率,所以我想知道:

具有一维条目的数组是否比压缩数组消耗更多内存?或者是否还有其他原因让我应该避免使用一维条目?

最佳答案

Do arrays with single-dimensional entries consume more memory than squeezed arrays?

它们占用相同的内存量。

NumPy 数组有一个名为 nbytes 的属性表示数组本身使用的字节数。使用它您可以轻松验证这一点:

>>> import numpy as np
>>> arr = np.ones((1024, 1024, 1))
>>> arr.nbytes
8388608
>>> arr.squeeze().nbytes
8388608

它占用相同内存量的原因实际上很简单:NumPy 数组不是真正的多维数组。它们是使用 strides 的一维数组。 “模拟”多维性。这些步幅给出了特定维度的内存偏移量:

>>> arr.strides
(8192, 8, 8)
>>> arr.squeeze().strides
(8192, 8)

因此,通过删除长度一维,您可以有效地删除零字节偏移量。

Or is there any other reason why I should avoid single-dimensional entries?

这要看情况。在某些情况下,您实际上自己创建这些以利用 broadcasting与 NumPy 数组。但在某些情况下它们很烦人。

<小时/>

请注意,实际上存在很小的内存差异,因为 NumPy 必须为每个维度存储一个步幅和形状整数:

>>> import sys
>>> sys.getsizeof(arr)
8388736
>>> sys.getsizeof(arr.squeeze().copy()) # remove one dimension
8388720
>>> sys.getsizeof(arr[:, None].copy()) # add one dimension
8388752

然而,与数组占用的 8kk 字节和使用约 100 字节的 View (挤压返回一个 View - 这就是我必须复制它的原因)相比,每个维度 16 字节并不算多。

关于python - 压缩数组(在 Python 中)比具有一维条目的数组小吗? ([x,y] 与 [x,y,1]?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49181070/

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