关注微信公众号:一个数据人的自留地
作者介绍
知乎@王多鱼
百度的一名推荐算法攻城狮。
主要负责商品推荐的召回和排序模型的优化工作。
1
前言
Python在数据科学、机器学习、AI领等域中占据主导地位,目前对于数据分析师和算法工程师来说是必备技能。
对于数据分析师来说,应掌握基础语法和数据科学的模块,主要包括:pandas、numpy和机器学习库sklearn等。
对于算法工程师来说,还应掌握深度学习相关模块,主要包括:tensorflow、pytorch等。
Python语法简单,入门容易,Numpy是Python中科学计算的核心库。它提供了一个高性能的多维数组对象,以及用于处理这些数组的工具。如果你想要进入Python中的数据科学或机器学习,你就要必须学习它。
一起入坑学习吧~
2
加载Numpy库
import numpy as np
3
array结构
NumPy 的数组类(array class)叫做 ndarray,同时我们也常称其为数组(array)。注意 numpy.array 和标准 Python 库中的类 array.array 是不同的。标准 Python 库中的类 array.array 只处理一维的数组,提供少量的功能。ndarray 还具有如下很多重要的属性:
ndarray.ndim:显示数组的轴线数量(或维度)。
ndarray.shape:显示在每个维度里数组的大小。如 n 行 m 列的矩阵,它的 shape 就是(n, m)。
一起尝试创建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.]]"""
4
查看abc的属性
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的长度: 3b的维度数量: 2b的元素数量: 6b的元素类型: float64c的元素类型名称: float64转换c的元素类型为int型: [[[1 2 3] [4 5 6]] [[3 2 1] [4 5 6]]]"""
5
创建数组的函数
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]]"""
6
Numpy的基础运算
# 基础运算# (1)加法add_result1 = b + aadd_result2 =np.add(b,a)print("\n加法1的结果: \n", add_result1)print("\n加法2的结果: \n", add_result2) # (2)减法subtract_result1 = a - bsubtract_result2 = np.subtract(a,b)print("\n减法1的结果: \n", subtract_result1)print("\n减法2的结果: \n", subtract_result2) # (3)乘法multiply_result1 = a * bmultiply_result2 = np.multiply(a,b)print("\n乘法1的结果: \n", multiply_result1)print("\n乘法2的结果: \n", multiply_result2) # (4)除法divide_result1 = a / bdivide_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.]]"""
7
Numpy的聚合函数
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]"""
8
索引数组的方法
(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索引
9
Array常用操作
Numpy中数组的连接函数主要有如下3个:
concatenate: 沿着现存的轴连接数据vstack: 竖直堆叠数据(行方向)hstack: 水平堆叠数据(列方向)
10
线性代数API
如下仅展示了简单的矩阵运算更多详细的方法可在实践中遇到在查找 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]]))"""
一个数据人的自留地是一个助力数据人成长的大家庭,帮助对数据感兴趣的伙伴们明确学习方向、精准提升技能。
扫码关注我,带你探索数据的神奇奥秘
我知道你在看哟