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)