问题描述

使用Numpy生成的数组对象,有时候会遇到需要交换特定的两行或者两列需求,如何实现这种呢?

分析思路

在Python交换两个值如何实现呢?如下

a=3;b=2
a,b=b,a

那交换数组对象两行或两列是不是也可以直接使用这种方法呢?还有没有其它办法呢?

实现

01使用python中交换值的思想

首先生成一个4x4的数组,需要交换第一行和第二行

import numpy as np
arr=np.arange(16).reshape(4,4)

arr数组结果为

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

利用numpy的数组对象的高级索引(关于数组索引请看这篇文章 numpy索引官方文档 中文) 取出第一行和第二行进行交换。

# [0,1]表示为第一行、第二行,逗号前是表示行的参数,逗号后的表示列,冒号表示所有列
arr[[0,1],:]=arr[[1,0],:]
print(arr)
# 结果如下
array([[ 4,  5,  6,  7],
       [ 0,  1,  2,  3],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

此处值得注意的是,此处交换是直接作用于arr原数组,如果不想对原数组修改,可以在交换之前,使用 np.copy(arr) 生成数组的副本,然后对副本进行修改
如果需要交换两列,代码类推

arr=np.arange(16).reshape(4,4)
arr_col=arr.copy(arr)
arr_col[:,[0,1]]=arr_col[:,[1,0]]
print("arr: \n",arr)
print("arr_col: \n",arr_col)

运行结果如下

arr: 
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
arr_col: 
 [[ 1  0  2  3]
 [ 5  4  6  7]
 [ 9  8 10 11]
 [13 12 14 15]]

02 使用索引 直接生成

在前面,我们可以直接用arr[[1,0],:] 按照[1,0]的顺序取出第二行和第一行,如下

print(arr[[1,0],:])
# 运行结果
array([[4, 5, 6, 7],
       [0, 1, 2, 3]])

因此,那我们只需要调换索引的位置,然后取出就可以实现两行的交换。
需要注意的是,arr[[1,0],:] 只是按照自定义的顺序取出,并没有直接修改原数组,所以我们需要赋值给一个新的对象保存

arr_row=arr[[1,0,2,3],:]
print(arr_row)

运行结果如下

array([[ 4,  5,  6,  7],
       [ 0,  1,  2,  3],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐