使用Numpy高级索引时列被替换,如何交换前两列与最后两列?
Numpy数组交换前两列与最后两列的正确方法
你代码里的问题很明确:swap_array[:, [0, 2]] = swap_array[:, [-2, -1]]是把最后两列的值直接覆盖到第0、2列,这不是交换——一来你没保存原目标列的原始数据,二来你选的列也不是真正的前两列(前两列应该是[0,1])。
针对未知数组大小的场景,有两种高效的交换方法:
方法一:原地交换(修改原数组)
先保存要交换的两部分数据副本,再分别赋值,避免覆盖原始数据:
import numpy as np test_array = np.array([ [1, 2, 3, 4, 5] , [5, 4, 3, 2, 1] , [5, 2, 2, 2, 1] , [1, 2, 2, 1, 1] ]) zeros = np.repeat(np.zeros((1, 5)), 2, axis=0) swap_array = np.vstack([test_array, zeros]) # 保存前两列和最后两列的副本 first_two = swap_array[:, :2].copy() last_two = swap_array[:, -2:].copy() # 执行交换 swap_array[:, :2] = last_two swap_array[:, -2:] = first_two print(swap_array)
输出结果:
[[4. 5. 3. 1. 2.] [2. 1. 3. 5. 4.] [2. 1. 2. 5. 2.] [1. 1. 2. 1. 2.] [0. 0. 0. 0. 0.] [0. 0. 0. 0. 0.]]
方法二:构造列索引生成新数组
通过重新排列列的索引顺序直接得到交换后的数组,适合不需要保留原数组的场景:
import numpy as np test_array = np.array([ [1, 2, 3, 4, 5] , [5, 4, 3, 2, 1] , [5, 2, 2, 2, 1] , [1, 2, 2, 1, 1] ]) zeros = np.repeat(np.zeros((1, 5)), 2, axis=0) swap_array = np.vstack([test_array, zeros]) n_cols = swap_array.shape[1] # 构造新的列顺序:最后两列 → 中间列(如果有) → 前两列 new_col_indices = np.concatenate([ np.arange(n_cols-2, n_cols), # 最后两列的索引 np.arange(2, n_cols-2), # 中间列的索引(列数≥4时有效) np.arange(2) # 前两列的索引 ]) swap_array_swapped = swap_array[:, new_col_indices] print(swap_array_swapped)
这个方法不需要额外的临时变量复制,利用Numpy的索引特性直接生成目标数组,效率很高。
注意:如果数组列数小于4(比如只有3列),交换“前两列”和“最后两列”会出现列重叠,这种情况需要根据实际需求额外判断,但通常该场景默认列数≥4。
内容的提问来源于stack exchange,提问作者tesla john
相关产品推荐
相关产品推荐

