如何用NumPy的stride_tricks.as_strided反转数组?尝试后得无效结果
用NumPy的
as_strided实现数组反转 可以用as_strided实现数组反转,但你当前的代码存在问题:你传入as_strided的inp_arr[15]是单个标量元素,而非原数组的视图。基于标量创建跨步数组时,程序会从该元素的内存位置向前(负步长方向)读取数据,但这些内存区域并不属于原数组,因此得到的是随机垃圾值。
正确实现代码
import numpy as np from numpy.lib.stride_tricks import as_strided elems = 16 inp_arr = np.arange(elems).astype(np.int8) # 基于原数组最后一个元素的视图创建反转数组 reversed_arr = as_strided(inp_arr[-1:], shape=inp_arr.shape, strides=(-inp_arr.strides[0],)) print(reversed_arr) print(reversed_arr.shape) print(reversed_arr.strides)
输出结果
[15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0] (16,) (-1,)
关键说明
inp_arr[-1:]是原数组最后一个元素的视图,它指向原数组最后一个元素的内存地址,而非复制单个元素。- 设置步长为
-inp_arr.strides[0](这里即-1,因为int8类型每个元素占1字节),意味着每次向前移动1字节读取下一个元素。 - 保持shape与原数组一致,就能完整读取原数组的所有元素并实现反转。
⚠️ 注意:as_strided直接操作内存,若步长或shape设置不当,很容易读取到数组外的内存区域,引发未定义行为。非必要场景下,优先使用arr[::-1]这种更安全的索引方式。
内容的提问来源于stack exchange,提问作者balu
相关产品推荐
相关产品推荐

