关于麻木大步的困惑

时间:2019-07-21 11:46:10

标签: python numpy numpy-ndarray

我正在看这个问题的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. 读取的第一个元素是10000 0000 0000 0001),
  2. 要读取的第二个元素是在跳过3个字节后得出的00000 0000 | 0000 0000),一半是数字512的字节,另一半是数字数字0
  3. 在另外3个字节的步幅之后要读取的最后一个元素是30000 0000 0000 0011

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

中的元素如何

1 个答案:

答案 0 :(得分:3)

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-13-46-7

这些是0000 0001 0000 00000000 0010 0000 00000000 0011 0000 0000,它们又被解释为小端。

  

数组的步幅告诉我们要沿着特定轴移到下一个位置,我们必须跳过多少个字节。

     

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

相关问题