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( 0000 0000 0000 0001),0(0000 0000 | 0000 0000),一半是从字节数512从数量和另一半03:0000 0000 0000 0011那么,我哪里出错了?2跨步输出中的中间元素如何而不是0
的 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
| 归档时间: |
|
| 查看次数: |
491 次 |
| 最近记录: |