【问题标题】:Confusion about numpy strides关于 numpy strides 的困惑
【发布时间】:2019-11-29 15:44:24
【问题描述】:

我正在查看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

【问题讨论】:

  • 在大多数使用中,as_strided 步幅将是输入的基本步幅的倍数,在这种情况下为 2。使用 3 是故意要求混淆。
  • 是的,我确实理解为什么这个例子对我来说很有趣,因为它操纵位和字节改变了基础数据。

标签: python numpy numpy-ndarray


【解决方案1】:

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

【讨论】:

  • 嘘!非常感谢,我花了相当多的时间来解决这个问题,并彻底检查了基础数据的“字节顺序”。
猜你喜欢
  • 1970-01-01
  • 2019-05-17
  • 2020-03-06
  • 2016-03-16
  • 2013-07-27
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多