Numpy是Python中科学计算的核心库。它提供了一个高性能的多维数组对象,以及用于处理这些数组的工具。如果你想要进入Python中的数据科学或机器学习,你就要必须学习它。接下来咱们一起学习一下它。
import numpy as np
NumPy 的数组类(array class)叫做 ndarray,同时我们也常称其为数组(array)。注意 numpy.array 和标准 Python 库中的类 array.array 是不同的。标准 Python 库中的类 array.array 只处理一维的数组,提供少量的功能。ndarray 还具有如下很多重要的属性:
ndarray.ndim:显示数组的轴线数量(或维度)。
一起尝试创建6个不同维度的array,如下:
a = np.array([1, 2, 3])
b = np.array([(1.5, 2, 3), (4, 5, 6)], dtype = float)
c = np.array([[(1.5, 2, 3), (4, 5, 6)], [(3, 2, 1), (4, 5, 6)]], dtype = float)
d = np.arange(10,25,5)
e = np.full((2, 2), 7)
f = np.eye(2)
print("a: \n", a)
print("\nb: \n", b)
print("\nc: \n", c)
print("\nd: \n", d)
print("\ne: \n", e)
print("\nf: \n", f)
"""
结果:
a:
[1 2 3]
b:
[[1.5 2. 3. ]
[4. 5. 6. ]]
c:
[[[1.5 2. 3. ]
[4. 5. 6. ]]
[[3. 2. 1. ]
[4. 5. 6. ]]]
d:
[10 15 20]
e:
[[7 7]
[7 7]]
f:
[[1. 0.]
[0. 1.]]
"""
print("a的维度: ", a.shape)
print("\na的长度: ", len(a))
print("\nb的维度数量: ", b.ndim)
print("\nb的元素数量: ", b.size)
print("\nb的元素类型: ", b.dtype)
print("\nc的元素类型名称: ", c.dtype.name)
print("\n转换c的元素类型为int型: \n", c.astype(int))
"""
结果:
a的维度: (3,)
a的长度: 3
b的维度数量: 2
b的元素数量: 6
b的元素类型: float64
c的元素类型名称: float64
转换c的元素类型为int型:
[[[1 2 3]
[4 5 6]]
[[3 2 1]
[4 5 6]]]
"""
print("\n创建3x4的0矩阵: \n", np.zeros((3,4)))
print("\n创建2x3x4的1矩阵: \n", np.ones((2,3,4), dtype=np.int16))
print("\n创建以10开始,以25结束,两个数间隔为5的数组: \n", np.arange(10,23,5)) #Create an array of evenly, spaced values (step value)
print("\n创建以0开始,以2结束,间隔数为(2-0)/(9-1)长度为9的数组: \n", np.linspace(0,2,9)) #Create an array of evenly, spaced values (number of samples)
print("\n创建2x2的7矩阵: \n", np.full((2,2),7))
print("\n创建2x2的单位矩阵: \n", np.eye(2))
print("\n创建2x2的随机数矩阵: \n", np.random.random((2,2)))
print("\n创建3x2的空矩阵: \n", np.empty((3,2)))
"""
结果:
创建3x4的0矩阵:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
创建2x3x4的1矩阵:
[[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]]
创建以10开始,以25结束,两个数间隔为5的数组:
[10 15 20]
创建以0开始,以2结束,间隔数为(2-0)/(9-1)长度为9的数组:
[0. 0.25 0.5 0.75 1. 1.25 1.5 1.75 2. ]
创建2x2的7矩阵:
[[7 7]
[7 7]]
创建2x2的单位矩阵:
[[1. 0.]
[0. 1.]]
创建2x2的随机数矩阵:
[[0.0681172 0.75448098]
[0.92933939 0.70908987]]
创建3x2的空矩阵:
[[1.39069238e-309 1.39069238e-309]
[1.39069238e-309 1.39069238e-309]
[1.39069238e-309 1.39069238e-309]]
"""
# 基础运算
# (1)加法
add_result1 = b + a
add_result2 =np.add(b,a)
print("\n加法1的结果: \n", add_result1)
print("\n加法2的结果: \n", add_result2)
# (2)减法
subtract_result1 = a - b
subtract_result2 = np.subtract(a,b)
print("\n减法1的结果: \n", subtract_result1)
print("\n减法2的结果: \n", subtract_result2)
# (3)乘法
multiply_result1 = a * b
multiply_result2 = np.multiply(a,b)
print("\n乘法1的结果: \n", multiply_result1)
print("\n乘法2的结果: \n", multiply_result2)
# (4)除法
divide_result1 = a / b
divide_result2 = np.divide(a,b)
print("\n除法1的结果: \n", divide_result1)
print("\n除法2的结果: \n", divide_result2)
# (5) 指数函数
print("\n矩阵b的指数结果: \n", np.exp(b))
# (6)平方根函数
print("\n矩阵b的平方根结果: \n", np.sqrt(b))
# (7)正弦函数
print("\n数组a的正弦结果: \n", np.sin(a))
# (8)余弦函数
print("\n矩阵b的余弦结果: \n", np.cos(b))
# (9)对数函数
print("\n数组a的对数结果: \n", np.log(a))
# (10)矩阵乘法
print("\n矩阵e与矩阵f的矩阵乘法结果: \n", e.dot(f))
"""
结果:
加法1的结果:
[[2.5 4. 6. ]
[5. 7. 9. ]]
加法2的结果:
[[2.5 4. 6. ]
[5. 7. 9. ]]
减法1的结果:
[[-0.5 0. 0. ]
[-3. -3. -3. ]]
减法2的结果:
[[-0.5 0. 0. ]
[-3. -3. -3. ]]
乘法1的结果:
[[ 1.5 4. 9. ]
[ 4. 10. 18. ]]
乘法2的结果:
[[ 1.5 4. 9. ]
[ 4. 10. 18. ]]
除法1的结果:
[[0.66666667 1. 1. ]
[0.25 0.4 0.5 ]]
除法2的结果:
[[0.66666667 1. 1. ]
[0.25 0.4 0.5 ]]
矩阵b的指数结果:
[[ 4.48168907 7.3890561 20.08553692]
[ 54.59815003 148.4131591 403.42879349]]
矩阵b的平方根结果:
[[1.22474487 1.41421356 1.73205081]
[2. 2.23606798 2.44948974]]
数组a的正弦结果:
[0.84147098 0.90929743 0.14112001]
矩阵b的余弦结果:
[[ 0.0707372 -0.41614684 -0.9899925 ]
[-0.65364362 0.28366219 0.96017029]]
数组a的对数结果:
[0. 0.69314718 1.09861229]
矩阵e与矩阵f的矩阵乘法结果:
[[7. 7.]
[7. 7.]]
"""
Numpy有很多有用的统计函数,用于从数组中给定的元素中查询最大、最小、标准差等。
print("\n数组a的和: \n", np.sum(a))
print("\n数组a的最小值: \n", np.min(a))
print("\n矩阵b在axis=0维度上的最大值: \n", np.max(b, axis=0))
print("\n矩阵b在axis=0维度上的累加值: \n", np.cumsum(b, axis=0))
print("\n数组a的平均值: \n", np.mean(a))
print("\n矩阵b的全局中位数: \n", np.median(b))
print("\n数组a自身的皮尔逊积矩相关系数: \n", np.corrcoef(a))
print("\n矩阵b的全局标准差: \n", np.std(b))
print("\n矩阵b在axis=1维度上的标准差: \n", np.std(b, axis=1))
"""
结果:
数组a的和:
6
数组a的最小值:
1
矩阵b在axis=0维度上的最大值:
[4. 5. 6.]
矩阵b在axis=0维度上的累加值:
[[1.5 2. 3. ]
[5.5 7. 9. ]]
数组a的平均值:
2.0
矩阵b的全局中位数:
3.5
数组a自身的皮尔逊积矩相关系数:
1.0
矩阵b的全局标准差:
1.5920810978785667
矩阵b在axis=1维度上的标准差:
[0.62360956 0.81649658]
"""
(1)整数组索引
print("数组a的第3个元素: ", a[2])
print("矩阵b的第2行第3列的元素: ", b[1, 2])
"""
结果:
数组a的第3个元素: 3
矩阵b的第2行第3列的元素: 6.0
"""
表现在图中,即为:
(2)切片(Slicing):与Python列表类似,可以对numpy数组进行切片。由于数组可能是多维的,因此必须为数组的每个维指定一个切片:
print("\n数组a的前2个元素: \n", a[0:2])
print("\n矩阵b的前2行的第2列的元素: \n", b[0:2, 1])
print("\n矩阵b的第一行的元素: \n", b[:1])
print("\n矩阵c的第0维的第2列的元素: \n", c[1,...])
print("\n数组a反转: \n", a[::-1])
"""
结果:
数组a的前2个元素:
[1 2]
矩阵b的前2行的第2列的元素:
[2. 5.]
矩阵b的第一行的元素:
[[1.5 2. 3. ]]
矩阵c的第0维的第2列的元素:
[[3. 2. 1.]
[4. 5. 6.]]
数组a反转:
[3 2 1]
"""
(3)布尔型索引
print("数组a的小于2的元素: ", a[a<2])
print("矩阵b的大于4的元素: ", b[b>4])
"""
结果:
数组a的小于2的元素: [1]
矩阵b的大于4的元素: [5. 6.]
"""
(4)Fancy索引
Numpy中数组的连接函数主要有如下3个:
concatenate: 沿着现存的轴连接数据
vstack: 竖直堆叠数据(行方向)
hstack: 水平堆叠数据(列方向)
如下仅展示了简单的矩阵运算更多详细的方法可在实践中遇到在查找 API。如下展示了矩阵的转置、求逆、单位矩阵、矩阵乘法、矩阵的迹、解线性方程和求特征向量等基本运算。
import numpy as np
a = np.array([[1.0, 2.0], [3.0, 4.0]])
print(a)
"""
[[ 1. 2.]
[ 3. 4.]]
"""
a.transpose()
"""
array([[ 1., 3.],
[ 2., 4.]])
"""
np.linalg.inv(a)
"""
array([[-2. , 1. ],
[ 1.5, -0.5]])
"""
u = np.eye(2) # unit 2x2 matrix; "eye" represents "I"
print(u)
"""
array([[ 1., 0.],
[ 0., 1.]])
"""
j = np.array([[0.0, -1.0], [1.0, 0.0]])
print(np.dot (j, j)) # matrix product
"""
array([[-1., 0.],
[ 0., -1.]])
"""
print(np.trace(u)) # trace
# 2.0
y = np.array([[5.], [7.]])
print(np.linalg.solve(a, y))
"""
array([[-3.],
[ 4.]])
"""
print(np.linalg.eig(j))
"""
(array([ 0.+1.j, 0.-1.j]),
array([[0.70710678+0.j, 0.70710678-0.j],
[0.00000000-0.70710678j, 0.00000000+0.70710678j]]))
"""