根据我的经验,编写 C 代码的工作量太大。简单地找到相关功能是最困难的部分。 strides 无论尺寸或“转置”如何,都一样工作。
从更简单的开始,例如 (2,3) 数组,其转置步长为 (8,24)。想象一下穿过平面 [0,1,2...]。
样本数组,大小为 1 字节,因此顺序步长仅为 1
In [635]: x=np.arange(6,dtype='uint8')
In [636]: x
Out[636]: array([0, 1, 2, 3, 4, 5], dtype=uint8)
In [637]: x.strides
Out[637]: (1,)
现在重塑它:
In [638]: y=x.reshape(2,3)
In [639]: y
Out[639]:
array([[0, 1, 2],
[3, 4, 5]], dtype=uint8)
In [640]: y.strides
Out[640]: (3, 1)
要遍历列,我们仍然只是通过共享的x 数据缓冲区一步一步。往下走,我们从 3、0 到 3、2 到 5 步进。
In [641]: z = y.transpose()
In [642]: z
Out[642]:
array([[0, 3],
[1, 4],
[2, 5]], dtype=uint8)
In [643]: z.strides
Out[643]: (1, 3)
现在我们一步一步往下走,一步一步跨过去。
但是你从图片中推断出相同的结果(我们应该正式忽略 :))
那么你的问题是什么?如果您在处理某些特定的 C 代码时遇到问题,您需要展示它,或者至少引用它。
遍历数组的方法有很多种。对于 flatiter strides 无关紧要,它只是一次通过数据缓冲区中的一项。
但是,例如,如果我们在第一个维度上进行迭代,
In [687]: for i in y:print(i)
[0 1 2]
[3 4 5]
以 3 步获取下一行。
In [688]: for i in z:print(i)
[0 3]
[1 4]
[2 5]
而这一步是 1。