numpy 获取二维数组四个角的元素,一个图让你快速理解索引参数的设置

我在过去很多年里,是用MATLAB来处理数据写数学模型的。MATLAB本身就是为了处理数据而生的一个软件,所以用起来非常简单高效。

直到有一天我遇到了python,开始学习数据分析和机器学习,由于前者需要购买版权,后者开源,还有那句“人生苦短,我用python”,我决定抛弃MATLAB投进python的怀抱。

虽然python各方面表现都很优,可是单说数据处理真的不如MATLAB高效,不过还好,numpy这个第三方库比这MATLAB强大的数据处理功能开发的,赋予了python不输MATLAB的数据处理功能。

数据处理自然绕不开切片功能,普通的取某些连续元素,或者固定间隔元素都比较好理解,如果需要获取二维数组四个角的元素,要是直接用元素所在位置的索引,就有失python的优雅。

在正式解释之前,我们先来看一段网友分享的代码。

import numpy as np
x = np.array([[0,  1,  2],[3,  4,  5],[6,  7,  8],[9,  10,  11]])
print('我们的数组是:')
print(x)print('\n')
rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]])
y = x[rows,cols]print('这个数组的四个角元素是:')
print(y)

运行结果如下

运行结果确实是我们想要的数组四个角的元素,但是这个示例代码并没有解释为什么行索引rows和列索引cols要这样设置。

首先我们把这个数据拿出来,红色框框里是四个角的元素,对应的索引是紫色的数字,分别是(0,0),(0,2),(3,0),(3,2)。

我们把行索引和列索引分别拿出来,并对应放置,就是:

到这里问题就解决了,如果我们直接让rows = np.array([0,0,3,3]),cols = np.array([0,2,0,2]),那么输出来的就是一个一维数组,如果按照我们需要的格式放置,就会输出对应格式的数组。

示例代码中就是将四个元素放置成2*2的二维数组。为了验证这个说法,我们运行一下一维数组的代码。

import numpy as np 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('我们的数组是:' )
print (x)
print ('\n')
rows = np.array([0,0,3,3]) 
cols = np.array([0,2,0,2]) 
y = x[rows,cols]  
print  ('这个数组的四个角元素是:')
print (y)

运行结果如下

跟我们一开始理解的一致。

接下来我们再来验证一下,如果rows和cols的维度没有完全对应一致,是否可以正确地输出结果?

import numpy as np 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('我们的数组是:' )
print (x)
print ('\n')
rows = np.array([[0],[0,3,3]]) 
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols]  
print  ('这个数组的四个角元素是:')
print (y)

运行结果如下:

果然报错了,这也从反面证明了rows和cols两个数组的维度必须是一致的。

说到维度,自然想起reshape自由变换数组维度,那我们就来看看能不能用reshape来自由变换新数组维度,让输出结果的维度更加灵活。

import numpy as np 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('我们的数组是:' )
print (x)