当前位置:   article > 正文

Numpy基础知识

numpy

一、Numpy简介

NumPy(Numeric Python)是一个用python实现的科学计算的扩展程序库,提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。NumPy这个词来源于两个单词– Numerical和Python。NumPy提供了许多高级的数值计算工具,如:矩阵数据类型、矢量处理,以及精密的运算库,可以轻松地进行数值计算。

二、Numpy数组计算基础

1、array函数的用法

1.1array函数主要的参数
参数说明
object创建的数组对象
dtypedtype指定数组元素的数据类型
ndminndmin指定生成几维数组

1.1.1 利用Numpy提供的array函数创建数组对象(object)

  1. import numpy as np # 导入模块包
  2. arr = np.array([]) # 创建空数组
  3. arr1 = np.array([1, 2, 3, 4, 5]) # 利用array函数创建一维数组
  4. arr2 = np.array([[1, 2, 3], [4, 5, 6]]) # 创建二维数组
'
运行

1.1.2 指定数组元素的数据类型(dtype)

  1. arr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=float)
  2. arr2 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], dtype=bool)
  3. arr3 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=complex)
  1. print("dtype指定数组元素的数据类型为浮点类型", arr1) # [1. 2. 3. 4. 5. 6. 7. 8. 9.]
  2. print("dtype指定数组元素的数据类型为bool类型", arr2) # [ True True True True True True True True True False]
  3. print("dtype指定数组元素的数据类型为复数类型", arr3) # [1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j 6.+0.j 7.+0.j 8.+0.j 9.+0.j]

1.1.3 指定数组元素的维数(ndmin)

  1. arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9], ndmin=3)
  2. print("ndmin值为1,指定生成一维数组", arr) # [1 2 3 4 5 6 7 8 9]
  3. print("ndmin值为2,指定生成二维数组", arr) # [[1 2 3 4 5 6 7 8 9]]
  4. print("ndmin值为3,指定生成三维数组", arr) # [[[1 2 3 4 5 6 7 8 9]]]
1.2数组的属性
属性说明
ndim返回int,表示数组的维度
shape返回元组,表示数组形状
size返回int,表示数组中的元素总数
dtype返回data-type,表示数组中元素的数据类型
itemsize返回int,表示数组中每个元素的储存空间(单位bite)

1.2.1 shape用于查看数组形状,结果用元组的形式表示

空的显示(0, )  一维表示 (元素个数,)  二维表示(行, 列)

  1. print(arr.shape) # (0,)
  2. print(arr1.shape) # (5,)
  3. print(arr2.shape) # (2, 3)

1.2.2 shape 重新设置数组的shape属性

  1. arr2.shape = 3, 2 # 把arr2 改成 3行2列数组
  2. [[1, 2],[3, 4],[5, 6]]

1.2.3 dtypt 查看数组元素类型

  1. arr = np.array([[1, 2, 3], [4, 5, 6]])
  2. print("dtype查看数组元素的类型", arr.dtype) # int

1.2.4 size 查看数组中的元素个数

  1. arr = np.array([[1, 2, 3], [4, 5, 6]])
  2. print("查看数组个数", arr.size) # 6

1.2.5 itemsize查看数组元素的储存空间

  1. arr = np.array([[1, 2, 3], [4, 5, 6]])
  2. print("查看数组元素的储存空间", arr.itemsize) # 4

2、arange函数的用法

  说明:  通过指定开始值、终值和步长来创建一维数组,创建的数组不包含终值

    

arange常用参数
参数说明
start开始值,默认为0
stop终值,生成的数组不包括该值
step步长
dtype指定输出的数据类型,默认为None

2.1、arange函数创建数组

  1. # arange函数的参数(start, stop, step, dtype)
  2. arr = np.arange(0, 10, 2, dtype=int) # 包首不包尾
  3. print(arr)
  4. [0 2 4 6 8]

3、linspace函数创建等差数列数组

linspace函数的常用参数
start开始值,无默认值
stop终值,生成的数组,包括该值,无默认值
num生成样本数,默认50个
dtype指定输出的数据类型,默认为None
  1. # linspace函数的参数(start, stop, num, dtype)
  2. arr1 = np.linspace(0, 10, 6, dtype=int) # 包头包尾 等差数列
  3. print(arr1) # [ 0 2 4 6 8 10]

4、logspace函数创建等比数列数组

logspace函数参数
参数说明
startbase ** start    指数 起始值
endbase ** end   指数 终值
num指定指数起始值到终值分成多少份, 默认 50 
endpoint布尔值,包不包括终值
base默认 10.0,指定底数
dtype指定输出类型
axis用于储存样本的轴,默认为0
  1. arrr = np.logspace(1, 5, num=5, endpoint=True, base=10.0, dtype=int, axis=0)
  2. print(arrr)
  3. 底数为 10 , 生成五个 指数为1-5的等比数列, 类型为int
  4. [ 10 100 1000 10000 100000]
  1. arrr = np.logspace(0, 4, num=5, endpoint=True, base=2, dtype=int, axis=0)
  2. print(arrr)
  3. [ 1 2 4 8 16]

5、zeros函数创建元素都为0的数组

  1. print("使用zeros创建 几行几列 元素全为0数组:\n", np.zeros((3, 4)))
  2. [[0. 0. 0. 0.]
  3. [0. 0. 0. 0.]
  4. [0. 0. 0. 0.]]

6、eye函数创建单位矩阵

  1. print("使用eye创建 (单位矩阵) 数组 :\n", np.eye((3)))
  2. [[1. 0. 0.]
  3. [0. 1. 0.]
  4. [0. 0. 1.]]

7、diag函数创建对角矩阵

  1. print("使用diag创建 对角矩阵 数组 :\n", np.diag([1, 2, 3, 4]))
  2. [[1 0 0 0]
  3. [0 2 0 0]
  4. [0 0 3 0]
  5. [0 0 0 4]]

8、ones函数创建数组

  1. print("使用ones创建 五行五列全为1 的数组 :\n", np.ones((5, 3)))
  2. [[1. 1. 1.]
  3. [1. 1. 1.]
  4. [1. 1. 1.]
  5. [1. 1. 1.]
  6. [1. 1. 1.]]

9、生成随机数

对于Numpy 来说 与随机数相关的函数都在random模块中, 其中可以生成服从多种概率分布的随机数函数

9.1、使用random函数生成随机数

参数为整数,返回随机浮点数个数

  1. import numpy as np
  2. print('生成0-1、10个随机数', np.random.random(10))
  3. # [0.10987808 ,0.46744674, 0.17708785, 0.30340278, 0.69318883 ,0.38080395 ,0.97276299 ,0.44607394 ,0.20992605 ,0.1303952 ]
'
运行

9.2、使用rand函数生成服从均匀分布的随机数

np.random.randn(d0,d1,d2……dn)

1)  当函数括号内没有参数时,则返回一个浮点数;

2)当函数括号内有一个参数时,则返回秩为1的数组,不能表示向量和矩阵;

3)当函数括号内有两个及以上参数时,则返回对应维度的数组,能表示向量或矩阵;

  1. # rand函数可以随机生成服从均匀分布的随机数
  2. print('生成2行2列服从均匀分布的随机数', np.random.rand(2, 2))
  3. # [[0.39393012 0.52005315]
  4. # [0.96116509 0.41460862]]

9.3、使用randn 函数生成服从正态分布的随机数(参数和rand类似)

  1. # 使用randn 函数生成服从正态分布的随机数
  2. print('生成2行2列服从正态分布的随机数', np.random.randn(2, 2))
  3. # [[0.51936168 - 0.85725725]
  4. # [0.02650592 - 0.12556538]]

9.4、使用randint 函数生成给定范围的随机数

  1. randint(最小值, 最大值, 几行几列的数组)
  2. print('生成2行2列给定范围的随机数', np.random.randint(2, 10, size=[2, 5]))
  3. # [[5 6 8 2 2]
  4. # [7 2 8 9 6]]

 10、变换数组的形状

10.1、使用reshape函数改变数组形状

  1. arr = np.arange(0, 10)
  2. print("将一维数组改成2行2列", arr.reshape(2, 5))
  3. # [[0 1 2 3 4]
  4. # [5 6 7 8 9]]

10.2、使用ravel, flatten函数展平数组

  1. arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  2. newArr = np.array(arr)
  3. # ravel 展平数组
  4. print(newArr.ravel())
  5. # [1 2 3 4 5 6 7 8 9]
  6. # flatten 展平数组
  7. # 它可以横向展品和纵向展品
  8. print('数组横向展平', newArr.flatten())
  9. print('数组纵向展平', newArr.flatten('F'))

10.3、使用hstack、vstack、concatenate 组合数组

concatenate(数组1, 数组2,axis=0或者1)

参数axis=1 时 可以对数组进行横向组合

参数axis=0 时 可以对数组进行纵向组合

  1. # 使用hstack 函数实现数组横向组合
  2. arr2 = np.arange(12).reshape(3, 4)
  3. arr3 = np.arange(12, 24).reshape(3, 4)
  4. print(arr2, arr3)
  5. # [[ 0 1 2 3]
  6. # [ 4 5 6 7]
  7. # [ 8 9 10 11]]
  8. #
  9. # [[12 13 14 15]
  10. # [16 17 18 19]
  11. # [20 21 22 23]]
  12. print('使用hstack 函数实现数组横向组合', np.hstack((arr3, arr2)))
  13. # [[12 13 14 15 0 1 2 3]
  14. # [16 17 18 19 4 5 6 7]
  15. # [20 21 22 23 8 9 10 11]]
  16. print('使用vstack 函数实现数组纵向组合', np.vstack((arr3, arr2)))
  17. # [[12 13 14 15]
  18. # [16 17 18 19]
  19. # [20 21 22 23]
  20. # [ 0 1 2 3]
  21. # [ 4 5 6 7]
  22. # [ 8 9 10 11]]
  23. # 使用 concatenate 函数组合数组
  24. print('使用concatenate 函数实现数组横向组合', np.concatenate((arr3, arr2), axis=1))
  25. # [[12 13 14 15 0 1 2 3]
  26. # [16 17 18 19 4 5 6 7]
  27. # [20 21 22 23 8 9 10 11]]
  28. print('使用concatenate 函数实现数组纵向组合', np.concatenate((arr3, arr2), axis=0))
  29. # [[12 13 14 15]
  30. # [16 17 18 19]
  31. # [20 21 22 23]
  32. # [ 0 1 2 3]
  33. # [ 4 5 6 7]
  34. # [ 8 9 10 11]]

10.3、使用hsplit、vsplit、split函数分割数组

split(数组1, 分割的份数,axis=0或者1)

参数axis=1 时 可以对数组进行横向分割

参数axis=0 时 可以对数组进行纵向分割

  1. # 使用hsplit vsplit split 函数进行数组分割
  2. print(arr2)
  3. # [[ 0 1 2 3]
  4. # [ 4 5 6 7]
  5. # [ 8 9 10 11]]
  6. print('使用 hsplit 函数实现数组横向分割', np.hsplit(arr2, 4 ))
  7. # [array([[0],[4],[8]]), array([[1],[5],[9]]), array([[ 2],[ 6],[10]]), array([[ 3],[ 7],[11]])]
  8. print('使用 vsplit 函数实现数组纵向分割', np.vsplit(arr2, 3 ))
  9. # [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
  10. print('使用 split 函数实现数组 纵向 分割', np.split(arr2, 3 , axis=0))
  11. # [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
  12. print('使用 split 函数实现数组 横向 分割', np.split(arr2, 2, axis=1))
  13. # [array([[0, 1],[4, 5],[8, 9]]), array([[2, 3],[6, 7],[10, 11]])]

三、创建Numpy 矩阵

在NumPy中,矩阵(Matrix)是二维的特殊数组对象,它具有特定的数学和线性代数属性。NumPy中的矩阵可以通过numpy.matrix 、mat、bmat类来创建,也可以使用二维NumPy数组来表示。

以下是一些关于NumPy矩阵的特点和功能:

  1. 二维结构:NumPy矩阵是二维的,具有行和列的结构。可以通过行号和列号来访问和操作矩阵中的元素。

  2. 矩阵运算:NumPy提供了许多用于矩阵运算的函数和方法,如矩阵乘法、逆矩阵、转置、行列式等。这些操作可以方便地应用于NumPy矩阵对象。

  3. 线性代数功能:NumPy的矩阵对象具有丰富的线性代数功能,包括求解线性方程组、特征值和特征向量计算、奇异值分解等。

  4. 简化的语法:NumPy矩阵对象提供了一些简化的语法,使得矩阵运算更加直观和易读。例如,可以使用 * 运算符进行矩阵乘法,使用 ** 运算符进行矩阵的幂运算。

  5. 切片和索引:与NumPy数组一样,可以使用切片和索引操作来访问和修改矩阵中的元素。可以通过行号和列号进行切片操作,或者使用布尔索引进行条件筛选。

  6. 数值计算:与NumPy数组一样,NumPy矩阵对象可以应用各种数值计算和统计函数,如求和、平均值、标准差等。

创建矩阵

  1. # 使用mat 创建矩阵
  2. Mat = np.mat('1 2 3; 4 5 6; 7 8 9') # 使用分号隔开数据
  3. print(Mat)
  4. # [[1 2 3]
  5. # [4 5 6]
  6. # [7 8 9]]
  7. # 使用 matrix 创建矩阵 直接传入二维数组
  8. Matrix = np.matrix([[1,2,3], [4,5,6], [7,8,9]]) #
  9. print(Matrix)
  10. # [[1 2 3]
  11. # [4 5 6]
  12. # [7 8 9]]
  13. # 使用 bmat 函数创建分块矩阵
  14. arr1 = np.eye(3)
  15. print(arr1)
  16. # [[1. 0. 0.]
  17. # [0. 1. 0.]
  18. # [0. 0. 1.]]
  19. arr2 = np.diag([1,2,3])
  20. print(arr2)
  21. # [[1 0 0]
  22. # [0 2 0]
  23. # [0 0 3]]
  24. print("创建的矩阵为\n", np.bmat('arr1 arr2'))
  25. # [[1. 0. 0. 1. 0. 0.]
  26. # [0. 1. 0. 0. 2. 0.]
  27. # [0. 0. 1. 0. 0. 3.]]
  28. print("创建的矩阵为\n", np.bmat('arr1 arr2; arr1 arr2'))
  29. # [[1. 0. 0. 1. 0. 0.]
  30. # [0. 1. 0. 0. 2. 0.]
  31. # [0. 0. 1. 0. 0. 3.]
  32. # [1. 0. 0. 1. 0. 0.]
  33. # [0. 1. 0. 0. 2. 0.]
  34. # [0. 0. 1. 0. 0. 3.]]

矩阵的运算

  1. # 矩阵运算
  2. # 矩阵相乘
  3. mat1 = np.mat('1 2 3; 4 5 6; 7 8 9') # 使用分号隔开数据
  4. mat2 = np.matrix([[1,2,3], [4,5,6], [7,8,9]])
  5. mutiply= mat1 * mat2
  6. print(mutiply)
  7. # [[ 30 36 42]
  8. # [ 66 81 96]
  9. # [102 126 150]]
  10. # 矩阵相加
  11. add = mat1 + mat2
  12. print(add)
  13. # [[ 2 4 6]
  14. # [ 8 10 12]
  15. # [14 16 18]]
  16. # 矩阵相减
  17. subtraction = mat1 - mat2
  18. print(subtraction)
  19. # 转置矩阵
  20. print(mat1)
  21. # [[1 2 3]
  22. # [4 5 6]
  23. # [7 8 9]]
  24. print(mat1.T)
  25. # [[1 4 7]
  26. # [2 5 8]
  27. # [3 6 9]]
  28. # 共轭矩阵
  29. print(mat1)
  30. # [[1 2 3]
  31. # [4 5 6]
  32. # [7 8 9]]
  33. print(mat1.H)
  34. # [[1 4 7]
  35. # [2 5 8]
  36. # [3 6 9]]

四、ufunc 函数

ufunc(Universal Function)是NumPy中的一种函数,用于对数组进行逐元素操作的通用函数。ufunc函数可以对数组的每个元素进行相同的操作,支持各种数学运算、逻辑运算和其他操作。

  1. 逐元素操作:ufunc函数对数组的每个元素进行操作,而不需要显式使用循环。这使得对大规模数组进行高效的向量化操作成为可能。

  2. 数学运算:ufunc函数支持各种数学运算,如加法、减法、乘法、除法、取余、指数、对数等。例如,numpy.add是一个ufunc函数,用于执行两个数组的逐元素加法操作。

  3. 逻辑运算:ufunc函数支持逻辑运算,如与(numpy.logical_and)、或(numpy.logical_or)、非(numpy.logical_not)等。这些函数可以应用于布尔类型的数组。

  4. 位运算:ufunc函数支持位运算,如与(numpy.bitwise_and)、或(numpy.bitwise_or)、异或(numpy.bitwise_xor)等。这些函数可以应用于整数类型的数组。

  5. 比较操作:ufunc函数支持比较操作,如大于(numpy.greater)、小于(numpy.less)、等于(numpy.equal)、不等于(numpy.not_equal)等。这些函数可以应用于各种数据类型的数组。

  6. 形状广播:ufunc函数支持形状广播(broadcasting),即在进行逐元素操作时自动调整数组的形状,使得操作能够在不同形状的数组上进行。

  7. 自定义ufunc函数:除了NumPy提供的内置ufunc函数,还可以自定义ufunc函数来执行特定的操作。通过使用numpy.vectorize装饰器或numpy.frompyfunc函数,可以将自定义函数转换为ufunc函数。

  1. # 数组的运算
  2. arr1 = np.array([1,2,3,4])
  3. arr2 = np.array([5,6,7,8])
  4. print('数组相加', arr1 + arr2)
  5. # 数组相加 [ 6 8 10 12]
  6. print('数组相乘', arr1 * arr2)
  7. # 数组相乘 [ 5 12 21 32]
  8. print('数组相除', arr1 / arr2)
  9. # 数组相除 [0.2 0.33333333 0.42857143 0.5 ]
  10. print('数组相减', arr1 - arr2)
  11. # 数组相减 [-4 -4 -4 -4]
  12. # 数组的比较运算
  13. print(arr1>arr2)
  14. # [False False False False]
  15. print(arr1<arr2)
  16. # [ True True True True]
  17. print(arr1==arr2)
  18. # [False False False False]
  19. print(arr1<=arr2)
  20. # [ True True True True]
  21. print(arr1>=arr2)
  22. # False False False False]
  23. print(arr1!=arr2)
  24. # [ True True True True]
  25. # 数组的逻辑运算
  26. print(np.all(arr1 == arr2))
  27. # False
  28. print(np.any(arr1 == arr2))
  29. # False

ufunc函数支持形状广播(broadcasting),即在进行逐元素操作时自动调整数组的形状,使得操作能够在不同形状的数组上进行

 

 

 

  1. arr1 = np.array([1 , 2, 3])
  2. arr2 = np.array([1])
  3. print(arr1 + arr2)
  4. # [2 3 4]
  5. arr1 = np.arange(0, 9).reshape(3, 3)
  6. print(arr1)
  7. # [[0 1 2]
  8. # [3 4 5]
  9. # [6 7 8]]
  10. arr2 = np.arange(1,4)
  11. print(arr2)
  12. # [1 2 3]
  13. print(arr1 + arr2)
  14. # [[ 1 3 5]
  15. # [ 4 6 8]
  16. # [ 7 9 11]]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/1004535
推荐阅读
相关标签
  

闽ICP备14008679号