Python二维数组操作的小Tips
前言
众所周知,利用MATLAB对矩阵,数组进行操作以及数值计算是非常方便的。然而,随着Mathworks对于国内高校,企业进行的限制(窝工被禁了MATLAB 555),很多同学转而使用Python作为MATLAB的代替品,Python虽然强大但是有些东西与MATLAB还是相差较大。尤其是对于工科的同学们来说,刚刚从MATLAB转向Python或许会有诸多的不习惯,本文就从其中一点——二维数组的操作入手,给出了一些小Tips,可以为大家节省一些试错的时间。Ps:本文并不是探寻Python二维数组的底层实现,或者实现方法,亦或对编程语句的探讨,仅仅是为一些从MATLAB转到Python的同学提出一些注意事项。
二维数组的创建
Python为我们提供了多种多样的数组创建方式,除了直接从文件中导入以外,其中最直观、常用的两种如下面的代码所示。我们可以用定义list的方式直接定义一个二维数组,也可以使用Numpy中的array函数定义二维数组。
// 二维数组创建
import numpy as np
group1=[[1,2,3],[4,5,6]]
group2=np.array([[1,2,3],[4,5,6]])
print(group1)
print(group2)
需要注意的是,二者打印的结果不尽相同。
//group1打印结果
[[1, 2, 3], [4, 5, 6]]
//group2打印结果
[[1 2 3]
[4 5 6]]
虽然在此打印页面看起来两个数组不一样,但是其对于行和列的描述是完全相同的。也就是说我们都可以单独操作某一行,某一列或者某一个元素。
例如:
print(group1[1])
print(group2[1])
会得到如下结果。
[4, 5, 6]
[4 5 6]
而
print(group1[1][0])
print(group2[1][0])
当然会得到
4
4
对于习惯MATLAB的工科同学们来说,需要注意的是Python中采用独立的"[ ]"而非()来表示元素的索引。
求二维数组最大/小值
以求最大值为例,MATLAB与Python一样,都使用了max作为关键字,那么这两种二维数组的计算最大值的结果是否一样呢?
print(max(group1))
print(max(group2))
当我们运行上面的代码会发现结果为
[4, 5, 6]
Traceback (most recent call last):
File "D:/Python/pyprojects/ex2.py", line 6, in <module>
print(max(group2))
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
group1的计算结果与MATLAB一样给出了每一列的最大值,这样我们只需要按照MATLAB中常用的
max(max(group1))
即可得到整个数组中的最大值。
但是对于利用Numpy库创建的数组却在计算最大值时报错。为了解决这一问题,我们可以采用如下代码计算group2的最大值
print(np.max(group2))
其运行结果为
6
可以看到,我们直接得到了矩阵的最大值。之所以两个group的结果不一样是因为:
Python中的list是python的内置数据类型,list中的数据类不必相同的。
在list中的数据类型保存的是数据所存放的地址,简单的说就是指针,并非数据。
而Numpy中的array所存放的数据类型必须全部相同。
因此,在求最大最小值的时候,我们可以简记为Numpy数组必须用Numpy操作。
二维数组求和
对于数组求和,我们可以分为求数组内元素和与数组之间相加,其中,数组之间相加是较为简单的。
以如下代码为例
import numpy as np
group1=[[1,2,3],[4,5,6]]
group2=np.array([[1,2,3],[4,5,6]])
group3=np.array([[1,2,3],[4,5,6]])
group4=[[1,2,3],[4,5,6]]
print(group1+group2)
print(group2+group3)
print(group1+group4)
其运行结果为:
//group1+group2
[[ 2 4 6]
[ 8 10 12]]
//group2+group3
[[ 2 4 6]
[ 8 10 12]]
//group1+group4
[[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]]
可以看到,除了group1+group4遵循Python中列表相加的规则以外,其余结果均一样。而对于list中相应元素相加则有许多方式可以实现,在实际操作中,尤其是工科数据处理中还是建议使用Numpy array形式创建数组。
对于数组内部求和,Python依然使用了与MATLAB中一样的关键字sum,以如下代码为例
import numpy as np
group1=[[1,2,3],[4,5,6]]
group2=np.array([[1,2,3],[4,5,6]])
print(sum(group2))
print(sum(group1))
//注意打印顺序是先打印 group2
其运行结果为:
//group2结果
[5 7 9]
//group1结果
Traceback (most recent call last):
File "D:/Python/pyprojects/ex2.py", line 6, in <module>
print(sum(group1))
TypeError: unsupported operand type(s) for +: 'int' and 'list'
可以看到group2的计算结果是每一列元素的和,而group1在求和操作中报错,报错原因是int类型与list类型不能相加。为了解决这个问题,我们修改代码为如下形式。
import numpy as np
group1=[[1,2,3],[4,5,6]]
group2=np.array([[1,2,3],[4,5,6]])
print(sum(group2))
print(np.sum(group1))
其运行结果为:
[5 7 9]
21
我们可以理解为,对group1我们采用Numpy库中的求和方法,而为了计算group2的总和我们也只需要把sum改为np.sum即可。
参考文献
https://blog.csdn.net/CatStarXcode/article/details/79039891
https://www.cnblogs.com/nxf-rabbit75/p/9997931.html