本章节主要来学习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提供了大量的内置算术函数。
我们可以使用重载的算术运算符对数组进行元素操作以创建新数组。可以使用+=, -=,*=
运算符修改现有数组。
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]]
许多一元运算是作为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]]
这些运算以元素方式应用于数组,并创建一个新数组。您可以使用所有基本的算术运算符,如+, - ,/ *
等,如果是+=, -=,*=
运算符,则会修改现有数组。
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]]
大家对上面的点乘可能已经忘记了,下面是点乘的公式:
因此对于二维矩阵的点乘,就会是如下结果:
[[a11*b11+a12*b21 a11*b12+a12*b22]
[a21*b11+a22*b21 a21*b12+a22*b22]]
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)。