如何简洁访问任意维度Numpy数组的倒数第二个单个元素
实现方法
你需要的「任意维度Numpy数组的全局倒数第二个单个元素」,本质是把数组按指定顺序展平为一维结构后,取索引为-2的元素。使用Numpy内置的ravel()方法可以非常简洁地实现该需求,且ravel()默认返回原数组的视图,修改操作会直接作用到原数组,完全匹配你的使用场景:
for array in arrays: print(array) # 修改前 print('CHANGE TEN') # 展平为一维数组后取倒数第二个元素修改 array.ravel()[-2] = 10 print(array, end='\n--------\n\n') # 修改后
运行后你示例的三个数组修改效果如下:
- 1D数组展平后和原结构一致,倒数第二个元素13修改为10,和你之前的运行结果一致
- 2D数组按行优先展平后,倒数第二个元素为原数组第三行的44,修改后仅该位置变为10:
[[20 30 40 50 60] [43 54 65 76 87] [11 22 33 10 55]] - 3D数组按行优先展平后,倒数第二个元素为原数组第二组第二行的54,修改后仅该位置变为10:
[[[ 1 2 3 4 5] [11 21 31 41 51]] [[11 12 13 14 15] [51 52 53 10 5]]]
相关说明
- 你之前使用的
array[..., -2]语法中,...代表省略所有前置维度的索引,-2代表取最后一个维度的倒数第二个位置,所以会返回所有前置维度组合下、最后一个维度的倒数第二个元素,自然会拿到多个值,和全局单个元素的需求不符。 - 如果你需要按列优先(Fortran顺序)展平取数,给
ravel传参order='F'即可,默认order='C'为行优先顺序,符合绝大多数场景的全局排序需求。 - 如果你不需要修改原数组,只想读取对应值,可以用
array.flatten()[-2],区别是flatten()会返回数组的副本,修改不会影响原数组。 - 建议使用前先判断
array.size >=2,避免数组元素总数小于2时触发IndexError。
内容的提问来源于stack exchange,提问作者Gheko
相关产品推荐
相关产品推荐

