gpt4 book ai didi

python - 对 numpy 步幅的困惑

转载 作者:行者123 更新时间:2023-12-04 02:46:17 40 4
gpt4 key购买 nike

我正在查看 answer对于这个问题,我无法理解 as_strided 函数是如何查看这个数组的。

这段代码是answer的一部分:

>>> a = np.lib.stride_tricks.as_strided(np.array([1, 512, 0, 3], dtype=np.int16), 
shape=(3,), strides=(3,))
>>> a
array([1, 2, 3], dtype=int16)

>>> a.strides[0]
3

>>> a.itemsize
2

假设传递的数组的每个元素都是 2 个字节长,我们有以下数组的字节表示:

-------------------------------------------------------------------------------------
1 | 512 | 0 | 3
-------------------------------------------------------------------------------------
0000 0000 0000 0001 | 0000 0010 0000 0000 | 0000 0000 0000 0000 | 0000 0000 0000 0011

因此,考虑到每个要读取的元素都是 2 个字节,而到达下一个元素的步长是 3 个字节:

  1. 读取的第一个元素是1 (0000 0000 0000 0001),
  2. 要读取的第二个元素是在跳过 3 个字节后得出的 0 (0000 0000 | 0000 0000),一半是数字中的字节512 和另一半从数字 0
  3. 在 3 个字节的另一步之后要读取的最后一个元素是 3:0000 0000 0000 0011

那么,我哪里错了?跨步输出中的中间元素 2 而不是 0

最佳答案

np.array([1, 512, 0, 3], dtype=np.int16) 的小端内存布局实际上在内存中看起来像这样(由于是小端字节序,各个条目字节的顺序实际上与您编写它们的顺序相反):

(value)
-----------------------------------------------------------------------------------------
1 | 512 | 0 | 3
-----------------------------------------------------------------------------------------
0000 0001 0000 0000 | 0000 0000 0000 0010 | 0000 0000 0000 0000 | 0000 0011 0000 0000
-----------------------------------------------------------------------------------------
0 1 2 3 4 5 6 7
(byte number)

stride=3意味着在项目之间移动 3 个字节,所以你会得到字节数 0-1 , 3-4 , 6-7 .

这些是 0000 0001 0000 0000 , 0000 0010 0000 0000 , 0000 0011 0000 0000 , 再次解释为小端。

The strides of an array tell us how many bytes we have to skip in memory to move to the next position along a certain axis.

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.strides.html

关于python - 对 numpy 步幅的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57132913/

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