numpy计算二维数组中值(一文看懂Numpy统计计算)
numpy计算二维数组中值(一文看懂Numpy统计计算)matrix= array([[ 5 10 15] [20 10 30] [35 40 45]]) matrix.sum(axis=1) array([ 30 60 120]) matrix.sum(axis=0) array([60 60 90]) 如上述例子所示,axis = 1计算的是行的和,结果以列的形式展示。axis = 0计算的是列的和,结果以行的形式展示。矩阵示例代码如下:需要注意的是,用于这些统计方法的数值类型必须是int或者float。数组示例代码如下:vector = numpy.array([5 10 15 20]) vector.sum() 得到的结果是50
导读:工欲善其事,必先利其器。此前,我们在《玩数据必备Python库:Numpy使用详解》一文中介绍了利用Numpy进行矩阵运算的方法,本文继续介绍Numpy的统计计算及其他科学运算的方法。
作者:魏溪含 涂铭 张修鹏
如需转载请联系华章科技
01 Numpy的统计计算方法NumPy内置了很多计算方法,其中最重要的统计方法及说明具体如下。
- sum():计算矩阵元素的和;矩阵的计算结果为一个一维数组,需要指定行或者列。
- mean():计算矩阵元素的平均值;矩阵的计算结果为一个一维数组,需要指定行或者列。
- max():计算矩阵元素的最大值;矩阵的计算结果为一个一维数组,需要指定行或者列。
- mean():计算矩阵元素的平均值。
- median():计算矩阵元素的中位数。
需要注意的是,用于这些统计方法的数值类型必须是int或者float。
数组示例代码如下:
vector = numpy.array([5 10 15 20]) vector.sum()
得到的结果是50
矩阵示例代码如下:
matrix= array([[ 5 10 15] [20 10 30] [35 40 45]]) matrix.sum(axis=1) array([ 30 60 120]) matrix.sum(axis=0) array([60 60 90])
如上述例子所示,axis = 1计算的是行的和,结果以列的形式展示。axis = 0计算的是列的和,结果以行的形式展示。
延伸学习:
官方推荐教程是不错的入门选择。
https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
02 Numpy中的arg运算argmax函数就是用来求一个array中最大值的下标。简单来说,就是最大的数所对应的索引(位置)是多少。示例代码如下:
index2 = np.argmax([1 2 6 3 2]) #返回的是2
argmin函数可用于求一个array中最小值的下标,用法与argmax类似。示例代码如下:
index2 = np.argmin([1 2 6 3 2]) #返回的是0
下面我们来探索下Numpy矩阵的排序和如何使用索引,示例代码如下:
import numpy as np x = np.arange(15) print(x) # array([ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]) np.random.shuffle(x) #随机打乱 print(x) # array([ 8 13 12 3 9 2 10 0 11 5 14 7 1 4 6]) sx = np.argsort(x) #从小到大排序,返回索引值 print(sx) # [ 7 12 5 3 13 9 14 11 0 4 6 8 2 1 10]
这里简单解释一下,第一个元素7代表的是x向量中的0的索引地址,第二个元素12代表的是x向量中的1的索引地址,其他元素以此类推。
03 FancyIndexing要索引向量中的一个值是比较容易的,比如通过x[0]来取值。但是,如果想要更复杂地取数,比如,需要返回第3个、第5个以及第8个元素时,应该怎么办?示例代码如下:
import numpy as np x = np.arange(15) ind = [3 5 8] print(x[ind]) #使用fancyindexing就可以解决这个问题
我们也可以从一维向量中构成新的二维矩阵,示例代码如下:
import numpy as np x = np.arange(15) np.random.shuffle(x) ind = np.array([[0 2] [1 3]]) #第一行需要取x向量中索引为0的元素,以及索引为2的元素,第二行需要取x向量中索引为1的元素以及索引为3的元素 print(x) print(x[ind])
我们来看下输出结果很容易就能明白了:
[ 3 2 7 12 9 13 11 14 10 5 4 1 6 8 0] [[ 3 7] [ 2 12]]
对于二维矩阵,我们使用fancyindexing取数也是比较容易的,示例代码如下:
import numpy as np x = np.arange(16) X = x.reshape(4 -1) row = np.array([0 1 2]) col = np.array([1 2 3]) print(X[row col]) #相当于取三个点,分别是(0 1) (1 2) (2 3) print(X[1:3 col]) #相当于取第2、3行,以及需要的列 04 Numpy数组比较
Numpy有一个强大的功能是数组或矩阵的比较,数据比较之后会产生boolean值。示例代码如下:
import numpy as np matrix = np.array([ [5 10 15] [20 25 30] [35 40 45] ]) m = (matrix == 25) print(m)
我们看到输出的结果如下:
[[False False False] [False True False] [False False False]]
下面再来看一个比较复杂的例子,示例代码如下:
import numpy as np matrix = np.array([ [5 10 15] [20 25 30] [35 40 45] ]) second_column_25 = (matrix[: 1] == 25) print(second_column_25) print(matrix[second_column_25 :])
上述代码中,print(second_column_25)输出的是[False True False],首先matrix[: 1]代表的是所有的行,以及索引为1的列,即[10 25 40],最后与25进行比较,得到的就是[False True False]。print(matrix[second_column_25 :])代表的是返回true值的那一行数据,即 [20 25 30]。
注意:上述的示例是单个条件,Numpy也允许我们使用条件符来拼接多个条件,其中“&”代表的是“且”,“|”代表的是“或”。比如,vector=np.array([5 10 11 12]) equal_to_five_and_ten = (vector == 5) & (vector == 10)返回的都是false,如果是equal_to_five_or_ten = (vector == 5) | (vector == 10),则返回的是[True True False False]。
比较之后,我们就可以通过np.count_nonzero(x<=3)来计算小于等于3的元素个数了,1代表True,0代表False。也可以通过np.any(x == 0),只要x中有一个元素等于0就返回True。np.all(x>0)则需要所有的元素都大于0才返回True。这一点可以帮助我们判断x里的数据是否满足一定的条件。
关于作者:魏溪含 ,爱丁堡大学人工智能硕士,阿里巴巴达摩院算法专家,在计算机视觉、大数据领域有8年以上的算法架构和研发经验。
涂铭,阿里巴巴数据架构师,对大数据、自然语言处理、图像识别、Python、Java相关技术有深入的研究,积累了丰富的实践经验。
张修鹏,毕业于中南大学,阿里巴巴技术发展专家,长期从事云计算、大数据、人工智能与物联网技术的商业化应用,在阿里巴巴首次将图像识别技术引入工业,并推动图像识别产品化、平台化。
本文摘编自《深度学习与图像识别:原理与实践》,经出版方授权发布。
延伸阅读《深度学习与图像识别:原理与实践》
推荐语:阿里巴巴达摩院算法专家、阿里巴巴技术发展专家、阿里巴巴数据架构师联合撰写,从技术原理、算法和工程实践3个维度系统展开,既适合零基础读者快速入门,又适合有基础读者理解其核心技术;写作方式上避开了艰涩的数学公式及其推导,深入浅出。