【发布时间】: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(0000 0000 0000 0001), - 第二个要读取的元素是在跳过 3 个字节后出来的
0(0000 0000 | 0000 0000),一半是来自数字512的字节,另一半来自数字0 - 在另一个 3 个字节的步长之后要读取的最后一个元素是
3:0000 0000 0000 0011
那么,我哪里错了?跨步输出中的中间元素2 而不是0
【问题讨论】:
-
在大多数使用中,
as_strided步幅将是输入的基本步幅的倍数,在这种情况下为 2。使用 3 是故意要求混淆。 -
是的,我确实理解为什么这个例子对我来说很有趣,因为它操纵位和字节改变了基础数据。
标签: python numpy numpy-ndarray