1.2 NumPy快速入门

本章节主要来学习NumPy中数组的常见函数与操作。主要包含以下内容:

一、数组索引

了解数组索引的基础知识对于分析和操作数组对象非常重要。NumPy提供了许多方法来进行数组索引。

import numpy as np arr = np.array([[-1, 2, 0, 4], [4, -0.5, 6, 0], [2.6, 0, 7, 8], [3, -7, 4, 2.0]]) # 切片数组 temp = arr[:2, ::2] print("前2行的列为(0和2)的数组:\n", temp) # 整数数组索引 temp = arr[[0, 1, 2, 3], [3, 2, 1, 0]] print("\n整数数组索引的值-> (0, 3), (1, 2), (2, 1), (3, 0):\n", temp) # 布尔数组索引 cond = arr > 0 temp = arr[cond] print("\n布尔数组索引,大于0的元素:\n", temp)

输出:

前2行的列为(0和2)的数组:
 [[-1.  0.]
 [ 4.  6.]]

整数数组索引的值-> (0, 3), (1, 2), (2, 1), (3, 0):
 [4. 6. 0. 3.]

布尔数组索引,大于0的元素:
 [2.  4.  4.  6.  2.6 7.  8.  3.  4.  2. ]

二、 NumPy基本算术操作

NumPy提供了大量的内置算术函数。

1. 单个数组的操作

我们可以使用重载的算术运算符对数组进行元素操作以创建新数组。可以使用+=, -=,*=运算符修改现有数组。

import numpy as np a = np.array([1, 2, 5, 3]) print("每个元素添加1:", a+1) print("从每个元素中减去3:", a-3) print("将每个元素乘以10:", a*10) print("每个元素进行平方运算:", a**2) # 将原始数组的每个元素加倍 a *= 2 print("将原始数组的每个元素加倍:", a) a = np.array([[1, 2, 3], [3, 4, 5], [9, 6, 0]]) print("\n原始数组:\n", a) print("转置后的数组:\n", a.T)

输出:

每个元素添加1: [2 3 6 4]
从每个元素中减去3: [-2 -1  2  0]
将每个元素乘以10: [10 20 50 30]
每个元素进行平方运算: [ 1  4 25  9]
将原始数组的每个元素加倍: [ 2  4 10  6]

原始数组:
 [[1 2 3]
 [3 4 5]
 [9 6 0]]
转置后的数组:
 [[1 3 9]
 [2 4 6]
 [3 5 0]]

2. 一元运算符

许多一元运算是作为ndarray类的方法提供的,这包括sum,min,max等。通过设置轴参数,也可以按行或列方式应用这些函数。axis=0代表列,axis=1代码行。

import numpy as np arr = np.array([[1, 5, 6], [4, 7, 9], [3, 1, 2]]) print("最大的元素是:", arr.max()) # axis=0代表列,axis=1代码行 print("每行最大元素:", arr.max(axis=1)) print("每列最小元素:", arr.min(axis=0)) print("数组所有元素的总和:", arr.sum()) print("每行累计的值:\n", arr.cumsum(axis=1))

输出:

最大的元素是: 9
每行最大元素: [6 9 3]
每列最小元素: [1 1 2]
数组所有元素的总和: 38
每行累计的值:
 [[ 1  6 12]
 [ 4 11 20]
 [ 3  4  6]]

3. 二元运算符

这些运算以元素方式应用于数组,并创建一个新数组。您可以使用所有基本的算术运算符,如+, - ,/ *等,如果是+=, -=,*=运算符,则会修改现有数组。

import numpy as np a = np.array([[1, 2], [3, 4]]) b = np.array([[4, 3], [2, 1]]) print("数组总和:\n", a + b) print("数组乘法:\n", a*b) print("矩阵乘法:\n", a.dot(b))

输出:

数组总和:
 [[5 5]
 [5 5]]
数组乘法:
 [[4 6]
 [6 4]]
矩阵乘法:
 [[ 8  5]
 [20 13]]

大家对上面的点乘可能已经忘记了,下面是点乘的公式:

20160419142046030

因此对于二维矩阵的点乘,就会是如下结果:

[[a11*b11+a12*b21 a11*b12+a12*b22]
[a21*b11+a22*b21 a21*b12+a22*b22]]

4. 通用函数

NumPy提供熟悉的数学函数,例如sin,cos,exp等。这些函数也按元素运算,产生数组作为输出。

**注意:**我们上面使用重载运算符执行的所有操作都可以使用函数来完成,如np.add,np.subtract,np.multiply,np.divide,np.sum等。

import numpy as np a = np.array([0, np.pi/2, np.pi]) print("数组:", a) # 数组元素的正弦值 print("数组元素的正弦值:", np.sin(a)) a = np.array([0, 1, 2, 9]) print("数组:", a) # 数组元素的指数 print("数组元素的指数:", np.exp(a)) # 数组元素的平方根 print("数组元素的平方根:", np.sqrt(a))

输出:

数组: [0.         1.57079633 3.14159265]
数组元素的正弦值: [0.0000000e+00 1.0000000e+00 1.2246468e-16]
数组: [0 1 2 9]
数组元素的指数: [1.00000000e+00 2.71828183e+00 7.38905610e+00 8.10308393e+03]
数组元素的平方根: [0.         1.         1.41421356 3.        ]

三、数组排序

有一个简单的np.sort方法用于NumPy数组排序。

函数格式如下:

numpy.sort(a, axis, kind, order)

参数说明:

NumPy 提供了多种排序的方法。 这些排序函数实现不同的排序算法,每个排序算法的特征在于执行速度,最坏情况性能,所需的工作空间和算法的稳定性。 下表显示了三种排序算法的比较。

种类 速度 最坏情况 工作空间 稳定性
'quicksort'(快速排序) 1 O(n^2) 0
'mergesort'(归并排序) 2 O(n*log(n)) ~n/2
'heapsort'(堆排序) 3 O(n*log(n)) 0

请看下面的示例:

import numpy as np a = np.array([[1, 4, 2], [3, 4, 6], [0, -1, 5]]) print("排序后的数组:\n", np.sort(a, axis=None)) print("逐行排序的数组:\n", np.sort(a, axis=1)) print("通过应用mergesort进行列式排序:\n", np.sort(a, axis=0, kind='mergesort')) # 演示结构化数组排序 # 设置字段和数据类型,其中"S10"代表取字符串的前10位。 dtypes = [('name', 'S10'), ('grad_year', int), ('score', float)] # 降值放入数组中 values = [('Hrithik', 2009, 8.5), ('Ajay', 2008, 8.7), ('Pankaj', 2008, 7.9), ('Aakash', 2009, 9.0)] # 创建数组 arr = np.array(values, dtype=dtypes) print("\n数组按名称排序:\n", np.sort(arr, order='name')) print("数组先以grad_year然后以score排序:\n", np.sort(arr, order=['grad_year', 'score']))

输出:

排序后的数组:
 [-1  0  1  2  3  4  4  5  6]
逐行排序的数组:
 [[ 1  2  4]
 [ 3  4  6]
 [-1  0  5]]
通过应用mergesort进行列式排序:
 [[ 0 -1  2]
 [ 1  4  5]
 [ 3  4  6]]

数组按名称排序:
 [(b'Aakash', 2009, 9. ) (b'Ajay', 2008, 8.7) (b'Hrithik', 2009, 8.5)
 (b'Pankaj', 2008, 7.9)]
数组先以grad_year然后以score排序:
 [(b'Pankaj', 2008, 7.9) (b'Ajay', 2008, 8.7) (b'Hrithik', 2009, 8.5)
 (b'Aakash', 2009, 9. )]

四、总结

若需本教程中所有章节的demo完整源码,请联系作者微信:lixu1770105。

上面的内容就是NumPy库中初级的语法很精简的介绍和教程。对于NumPy库更高级的语法请继续学习下一章的内容。

若有问题,欢迎联系作者(微信:lixu1770105)。