[英]Wrong `nbytes` value in a numpy array after broadcasting with `broadcast_to`
我刚刚注意到这一点:
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
看起来确实像 shape 和itemsize
的乘积,或者arr.size*arr.itemsize
。
在我看过的所有示例中, nbytes
使用 arrays 的形状/大小,而不是它的base
。 所以我不会过多地阅读文档中使用的“消耗”。
你的例子:
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
反映了它自己的形状,而不是 base 的形状。
再举一个例子,其中view
是基础的子集:
In [122]: np.arange(100).nbytes
Out[122]: 400
In [123]: np.arange(100)[::4].nbytes
Out[123]: 100
broadcast_to
的代码可在np.lib.stride_tricks._broadcast_to
查看。 它使用np.nditer
生成新视图。
sys.getsizeof
做了一个合理的工作,返回 memory 用于一个数组及其 on 数据(即base
是None
)。 它不为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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.