Python二维数组操作的小Tips

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值