关于 numpy strides 的困惑

Raf*_*han 3 python numpy numpy-ndarray

我正在查看这个问题的答案,但无法理解as_strided函数是查看这个数组的。

这段代码是答案的一部分:

>>> 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 
Run Code Online (Sandbox Code Playgroud)

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

-------------------------------------------------------------------------------------
         1          |        512          |        0            |          3
-------------------------------------------------------------------------------------
0000 0000 0000 0001 | 0000 0010 0000 0000 | 0000 0000 0000 0000 | 0000 0000 0000 0011
Run Code Online (Sandbox Code Playgroud)

因此,考虑到要读取的每个元素为 2 个字节,到达下一个元素的步幅为 3 个字节:

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

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

cid*_*ole 5

的 little-endian 内存布局np.array([1, 512, 0, 3], dtype=np.int16)在内存中实际上是这样的(由于是 little-endian,各个入口字节实际上与您编写它们的顺序相反):

(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)
Run Code Online (Sandbox Code Playgroud)

stride=3表示在项目之间移动 3 个字节,因此您将获得字节数0-1, 3-4, 6-7

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

数组的步幅告诉我们必须在内存中跳过多少字节才能沿某个轴移动到下一个位置。

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