Py学习  »  Python

从numpy开启Python数据科学之旅

小白学视觉 • 2 年前 • 202 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达


 

    目前小编的Python学习是按照两个路径在一路往下推,希望借此改变过去大半年的Python一直在入门的状态。一个路径就是从纯编程语言的角度来学习Python的,包括Python编程基础、编写函数、Python高级特性、函数式编程、面向对象编程、多进程和多线程、常用内建模块和第三方库等等,旨在学习和锻炼编程思维,提高小编自身的coding能力。另一个路径是按照数据科学的角度来学习Python,这条路径是想将R语言的数据处理和分析能力搬到Python上,主要是学习一些可用于数据分析的Python库,包括NumPy、Pandas、SciPy、Matplotlib、Seaborn和scikit-learn等等。

    第一个路径学习所使用的资料是廖雪峰老师Python3教程 廖雪峰Python3教程 。

    第二个路径的学习资料主要来自Python的帮助文档和Wes McKinney的Python for Data Analysis 一书。各位看官可自行去网上寻找一下这本Python数据分析入门书籍。先简单介绍了下小编学习Python主要方法和参考资料,很明显今天的主题numpy是属于第二个路径的内容,下面就开始进入今天的正题。

NumPy简介

    NumPy是Python中科学计算库,其主要对象是包含同种元素的多维数组。在NumPy中数组的维度也叫做轴(axis),轴的个数叫做秩(rank)。小编在这里有必要跟大家提醒一下,线性代数真的是一门很重要的数学基础课程,认真学好并精通真的是太重要了。

    本文小编主要从如何利用numpy创建一个数组对象、打印数组、numpy对象的基本运算和线性代数运算、数组的索引与切片、变换数组形状等方面来介绍numpy。

创建一个numpy对象

    利用numpy创建数组对象方法很多,但最常用的还是 array方法和 arange方法。先看利用 arange方法创建的数组对象:

  1. #arange方法创建一个数组

  2. import numpy as np

  3. a = np.arange(15).reshape(3,5)

  4. a

  5. array([[ 0,  1,  2,  3,  4],

  6.       [ 5,  6,  7,  8,  9],

  7.       [10, 11, 12, 13, 14]])

  8. #arange()创建数组的另一种方式

  9. np.arange(10,30 ,5)

  10. array([10, 15, 20, 25])

    再看 array方法:

  1. #array方法创建一个数组

  2. b = np.array([6,7,8])

  3. b

  4. array([6, 7, 8])

    对创建后的数组对象可以查看一些属性:

  1. #查看数组维度

  2. a.shape

  3. ( 3, 5)

  4. #查看数组轴的个数

  5. a.ndim

  6. 2

  7. #查看数组对象元素类型

  8. a.dtype

  9. dtype('int32')

  10. #查看对象类型

  11. type(a)

  12. numpy.ndarray

  13. type(b)

  14. numpy.ndarray

    可以看到numpy数组类为ndarray。我们也可以在创建数组的时候就指定元素类型:

  1. #在数组创建时就指定dtype

  2. c = np.array([[1,2],[ 3,4]], dtype = complex)

  3. c

  4. array([[ 1.+0.j,  2.+0.j],

  5.       [ 3.+0.j,  4.+0.j]])

    还可以利用一些基础函数来创建数组:

  1. #创建全零矩阵

  2. np.zeros((3,4))

  3. array([[ 0.,  0.,  0.,  0.],

  4.       [ 0.,  0. ,  0.,  0.],

  5.       [ 0.,  0.,  0.,  0.]])

  6. #创建全一矩阵

  7. np.ones((3,4))

  8. array([[ 1.,  1.,  1.,  1.],

  9.       [ 1.,  1.,  1.,  1.],

  10.       [ 1.,  1.,  1.,  1.]])


打印数组

    从上面的演示大家应该也可以看到,在Python中直接输入数组对象后返回的是一个带有array字样的对象,但使用 print函数对数组对象进行打印显示的结果就不会有这个字样了:

  1. #一维数组打印成行

  2. x = np.arange(5)

  3. print(x)

  4. [0 1 2 3 4]

  5. #二维数组打印成矩阵

  6. y = np.arange(10).reshape(2,5)

  7. print(y)

  8. [[0 1 2 3 4]

  9. [5 6 7 8 9]]

  10. #三维数组打印成矩阵列表

  11. z = np.arange(24).reshape(2,3,4)

  12. print(z)

  13. [[[ 0  1  2  3]

  14.  [ 4  5  6  7]

  15.  [ 8  9 10 11]]

  16. [[12 13 14 15]

  17.  [16 17 18 19]

  18.  [20 21 22 23]]]


数组的基本运算

    既然numpy是科学计算库,它的进行一些计算也是非常强大的:

  1. #numpy数组对象是按照对应进行运算的

  2. a = np.array([10,20,30 ,40])

  3. b = np.arange(10,30,5)

  4. c = a - b

  5. c

  6. array([ 0,  5, 10, 15])

  7. b ** 2

  8. array([100, 225, 400, 625], dtype=int32)

  9. a < 35

  10. array([ True,   True,  True, False], dtype=bool)

  11. #numpy中*按元素进行运算,矩阵乘法使用dot函数

  12. a = np.array([[1,1],[0,1]])

  13. b = np.array([[2,0],[3,4]])

  14. a * b

  15. array([[2, 0],

  16.       [0, 4]])

  17. np.dot(a,b)

  18. array([[5, 4],

  19.       [3, 4]])

    可见,Python矩阵的计算采用的是点乘的方式,跟matlab较为相似。除了直接的四则运算,还可以复杂一点:

  1. #*=/+=等符号用来更改已存在的数组而不是创建一个新的数组

  2. a *= 3

  3. a

  4. array([[3, 3],

  5.       [0, 3]])

  6. b += a #b=b+a

  7. b

  8. array([[ 8,  6],

  9.       [ 3, 10]])

  10. #axis参数对数组指定轴进行运算

  11. c = np.arange(12).reshape(3,4)

  12. c

  13. array([12, 15, 18, 21])

  14. #对数组每行取最小值

  15. c.min(axis = 1)

  16. array([[ 0,  1,  2,  3],

  17.       [ 4,  5,  6,  7],

  18.       [ 8 ,  9, 10, 11]])

  19. #对数组每列进行求和计算

  20. c.sum(axis = 0)

  21. array([12, 15, 18, 21])

  22. #numpy也提供一些通用的数学计算函数

  23. b = np.arange(5)

  24. np.exp(b)

  25. array([  1.        ,   2.71828183,   7.3890561 ,  20.08553692,  54.59815003])

  26. np.sqrt(b)

  27. array([  1.        ,   2.71828183,   7.3890561 ,  20.08553692,  54.59815003])

    利用numpy进行线性代数运算也是非常方便的:

  1. import numpy as np

  2. from numpy.linalg import *

  3. a = np.array([[1,2],[3,4]])

  4. print(a)

  5. [[1 2]

  6. [3 4]]

  7. #求转置

  8. a.transpose()

  9. array([[1, 3],

  10.       [2, 4]])

  11. #求逆

  12. inv(a)

  13. array([[-2. ,  1. ],

  14.       [ 1.5, -0.5]])

  15. #生成单位阵

  16. np.eye(3)

  17. array([[ 1.,  0.,  0.],

  18.       [ 0.,  1. ,  0.],

  19.       [ 0.,  0.,  1.]])

  20. #求迹

  21. np.trace(a)

  22. 5

  23. #求解矩阵方程

  24. y = np.array([[5],[7]])

  25. solve(a,y)

  26. array([[-3.],

  27.       [ 4.]])

    关于numpy的简单运算小编就例举这么多,细加探索numpy远比你想象的要强大。

数组对象的索引与切片

    关于切片的知识,小编在之前的Python学习的第一条路径中就已介绍过了,主要是针对list和tuple对象,将索引和切片应用在数组上也是非常方便的。

  1. a = np.arange( 10)**2

  2. a

  3. array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81], dtype=int32)

  4. #访问一个数

  5. a[3]

  6. 9

  7. #访问一串数

  8. a[2:5]

  9. array([ 4,  9, 16], dtype=int32)

  10. #按索引替换元素

  11. a[:6:2] = 2017

  12. a

  13. array([2017,    1, 2017,    9, 2017,   25,   36,   49,   64,   81], dtype=int32)

  14. #给数组反向呈现

  15. a[::-1]

  16. array([  81,   64,   49,   36,   25, 2017,    9 , 2017,    1, 2017], dtype=int32)

  17. #多维数组对每个轴都可以进行索引

  18. def f(x,y):

  19.    return x*3+2*y

  20. b = np.fromfunction(f,(5,4),dtype = int)

  21. b

  22. array([[ 0,  2,  4,  6],

  23.       [ 3,  5,  7,  9],

  24.       [ 6 ,  8, 10, 12],

  25.       [ 9, 11, 13, 15],

  26.       [12, 14, 16, 18]])

  27. b[2,3]

  28. 12

  29. b[0:5,1]

  30. array([ 2,  5,  8, 11, 14])

  31. #当少于轴数的索引被提供时,则被默认为取整个切片

  32. b[-1]

  33. array([12, 14, 16, 18])


更改数组形状

    最后一个需要给大家介绍的是对数组形状进行更改:

  1. a = np.arange(10,110,10).reshape(2,5)

  2. a

  3. array([[ 10,  20,  30,  40,  50],

  4.       [ 60 ,  70,  80,  90, 100]])

  5. a.shape

  6. (2, 5)

  7. #展开数组

  8. a.ravel()

  9. array([ 10,  20,  30,  40,  50,  60,  70,  80,  90, 100])

  10. #reshape函数仅改变参数形状,而resize函数则改变数组本身

  11. a.resize(5,2)

  12. a

  13. array([[ 10,  20],

  14.       [ 30,  40],

  15.       [ 50,  60],

  16.       [ 70,  80],

  17.       [ 90, 100]])

    可见reshape方法与resize方法还是有着本质的区别。

NumPy总结


1.创建数组 arange, array, copy, empty, emptylike, eye, fromfile, fromfunction, identity, linspace, logspace, mgrid, ogrid, ones, oneslike, r , zeros, zeros_like 

2.转化 astype, atleast 1d, atleast 2d, atleast 3d, mat 

3.操作 array split, column stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, item, newaxis, ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack 

4.询问 all, any, nonzero, where 

5.排序 argmax, argmin, argsort, max, min, ptp, searchsorted, sort 

6.运算 choose, compress, cumprod, cumsum, inner, fill, imag, prod, put, putmask, real, sum 

7.基础统计和线性代数 cov, mean, std, var, cross, dot, outer, svd, vdot, eye, transpose, inv, trace

参考资料:

http://www.numpy.org/


下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/124531
 
202 次点击