python - 使用 `nbytes` 广播后,numpy 数组中的 `broadcast_to` 值错误

标签 python arrays numpy

我刚刚注意到这一点:

import numpy as np
import sys

arr = np.broadcast_to(0, (10, 1000000000000))
print(arr.nbytes)  # prints "80000000000000"
print(sys.getsizeof(arr))  # prints "120"

这是一个错误还是预期的行为?即,nbytes 是否意味着保存“逻辑”字节数,而不是考虑 0 步幅?

最佳答案

虽然我没有看到它的记录,但nbytes看起来确实像形状和itemsize的乘积,或arr.size*arr.itemsize.

在我看过的所有示例中,nbytes 使用形状/大小的数组,而不是其 的数组。所以我不会过多地阅读文档中使用的“消耗”。

你的例子:

In [117]: arr = np.broadcast_to(0,(1,2,3))

In [119]: arr.shape, arr.strides, arr.nbytes
Out[119]: ((1, 2, 3), (0, 0, 0), 24)

In [120]: arr.base
Out[120]: array(0)

In [121]: arr.base.nbytes
Out[121]: 4

广播数组是一个小得多的数组的 View nbytes 反射(reflect)其自身的形状,而不是基数的形状。

再举一个例子,其中 View 是基础的子集:

In [122]: np.arange(100).nbytes
Out[122]: 400

In [123]: np.arange(100)[::4].nbytes
Out[123]: 100

可以在np.lib.stride_tricks._broadcast_to查看broadcast_to的代码。它使用 np.nditer 生成新 View 。

sys.getsizeof 合理地返回了数组及其 on 数据的内存使用情况(即 baseNone)。它不为 View 提供任何有用的信息。

滑动窗口

用于制作“更大”数组的跨步技巧的另一个示例:

In [180]: arr = np.arange(16).reshape(4,4).copy()

In [181]: arr.shape, arr.strides, arr.nbytes
Out[181]: ((4, 4), (16, 4), 64)

In [182]: res = np.lib.stride_tricks.sliding_window_view(arr,(2,2))

In [183]: res.shape, res.strides, res.nbytes
Out[183]: ((3, 3, 2, 2), (16, 4, 16, 4), 144)

这是原始 (4,4) arr View :

In [184]: res.base
Out[184]: <numpy.lib.stride_tricks.DummyArray at 0x1fa8e7cc730>

In [185]: res.base.base
Out[185]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [186]: res.base.base is arr
Out[186]: True

关于python - 使用 `nbytes` 广播后,numpy 数组中的 `broadcast_to` 值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74990485/

相关文章:

python - 如何在Python中标记整数列表?

Javascript 诗歌生成器——将子字符串与数组中的任何单个元素匹配

javascript - 理解 sort() 一贯的错误行为

python - 如何[使用 Python] 创建 SIFT 的描述符数据库?

python - 如何向量化 `__call__`方法

python - SVM 的数据太多?

python - Scipy - 统计 - 概率分布参数的含义

javascript - 从函数生成模板文字的正确方法

python - 在 Python 中排除 collections.Counter 中的零

python - 在 sqlalchemy 中使用计算列更新表