【本文转载自微信公众号:数据科学家养成记,作者:louwill,转载授权请联系原作者】
目前小编的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方法创建的数组对象:
- #arange方法创建一个数组
- import numpy as np
- a = np.arange(15).reshape(3,5)
- a
- array([[ 0, 1, 2, 3, 4],
- [ 5, 6, 7, 8, 9],
- [10, 11, 12, 13, 14]])
- #arange()创建数组的另一种方式
- np.arange(10,30,5)
- array([10, 15, 20, 25])
再看array方法:
- #array方法创建一个数组
- b = np.array([6,7,8])
- b
- array([6, 7, 8])
对创建后的数组对象可以查看一些属性:
- #查看数组维度
- a.shape
- (3, 5)
- #查看数组轴的个数
- a.ndim
- 2
- #查看数组对象元素类型
- a.dtype
- dtype(‘int32’)
- #查看对象类型
- type(a)
- numpy.ndarray
- type(b)
- numpy.ndarray
可以看到numpy数组类为ndarray。 我们也可以在创建数组的时候就指定元素类型:
- #在数组创建时就指定dtype
- c = np.array([[1,2],[3,4]], dtype = complex)
- c
- array([[ 1.+0.j,2.+0.j],
- [ 3.+0.j,4.+0.j]])
还可以利用一些基础函数来创建数组:
- #创建全零矩阵
- np.zeros((3,4))
- array([[ 0.,0.,0.,0.],
- [ 0.,0.,0., 0.],
- [ 0.,0.,0.,0.]])
- #创建全一矩阵
- np.ones((3,4))
- array([[ 1.,1.,1.,1.],
- [ 1.,1.,1.,1.],
- [ 1.,1.,1.,1.]])
打印数组
从上面的演示大家应该也可以看到,在Python中直接输入数组对象后返回的是一个带有array字样的对象,但使用 print函数对数组对象进行打印显示的结果就不会有这个字样了:
- #一维数组打印成行
- x = np.arange(5)
- (x)
- [0 1 2 3 4]
- #二维数组打印成矩阵
- y = np.arange(10).reshape(2,5)
- (y)
- [[0 1 2 3 4]
- [5 6 7 8 9]]
- #三维数组打印成矩阵列表
- z = np.arange(24).reshape(2,3,4)
- (z)
- [[[ 0 1 2 3]
- [ 4 5 6 7]
- [ 8 9 10 11]]
- [[12 13 14 15]
- [16 17 18 19]
- [20 21 22 23]]]
数组的基本运算
既然numpy是科学计算库,它的进行一些计算也是非常强大的:
- #numpy数组对象是按照对应进行运算的
- a = np.array([10,20,30,40])
- b = np.arange(10,30,5)
- c = a – b
- c
- array([ 0,5,10,15])
- b **
- 2
- array([100,225,400,625], dtype=int32)
- a < 35
- array([ True,True,True,False], dtype=bool)
- #numpy中*按元素进行运算,矩阵乘法使用dot函数
- a = np.array([[1,1],[0,1]])
- b = np.array([[2,0],[3,4]])
- a * b
- array([[2,0],
- [0, 4]])
- np.dot(a,b)
- array([[5,4],
- [3,4]])
可见,Python矩阵的计算采用的是点乘的方式,跟matlab较为相似。 除了直接的四则运算,还可以复杂一点:
- #*=/+=等符号用来更改已存在的数组而不是创建一个新的数组
- a *= 3
- a
- array([[3,3],
- [0,3]])
- b += a
- #b=b+a
- b
- array([[ 8,6],
- [ 3,10]])
- #axis参数对数组指定轴进行运算
- c = np.arange(12).reshape(3,4)
- c
- array([12,15,18,21])
- #对数组每行取最小值
- c.min(axis = 1)
- array([[ 0,1,2,3],
- [ 4,5,6,7],
- [8,9,10,11]])
- #对数组每列进行求和计算
- c.sum(axis = 0)
- array([12,15,18,21])
- #numpy也提供一些通用的数学计算函数
- b = np.arange(5)
- np.exp(b)
- array([ 1. , 2.71828183,7.3890561 ,20.08553692,54.59815003])
- np.sqrt(b)
- array([ 1. ,2.71828183,7.3890561 ,20.08553692,54.59815003])
利用numpy进行线性代数运算也是非常方便的:
- import
- numpy
- as
- np
- from
- numpy.linalg
- import
- *
- a = np.array([[1,2],[3,4]])
- (a)
- [[1 2]
- [3 4]]
- #求转置
- a.transpose()
- array([[1,3],
- [2,4]])
- #求逆
- inv(a)
- array([[–2. ,1. ],
- [ 1.5, –0.5]])
- #生成单位阵
- np.eye(3)
- array([[ 1.,0.,0.],
- [ 0.,1.,0.],
- [ 0.,0.,1.]])
- #求迹
- np.trace(a)
- 5
- #求解矩阵方程
- y = np.array([[5],[7]])
- solve(a,y)
- array([[–3.],
- [ 4.]])
关于numpy的简单运算小编就例举这么多,细加探索numpy远比你想象的要强大。
数组对象的索引与切片
关于切片的知识,小编在之前的Python学习的第一条路径中就已介绍过了,主要是针对list和tuple对象,将索引和切片应用在数组上也是非常方便的。
- a = np.arange(10)**2
- a
- array([ 0,1,4,9,16,25,36,49,64,81], dtype=int32)
- #访问一个数
- a[3]
- 9
- #访问一串数
- a[2:5]
- array([ 4,9,16], dtype=int32)
- #按索引替换元素
- a[:6:2] =2017
- a
- array([2017,1,2017,9,2017,25,36,49,64,81], dtype=int32)
- #给数组反向呈现
- a[::–1]
- array([ 81,64,49,36,25,2017,9,2017,1,2017], dtype=int32)
- #多维数组对每个轴都可以进行索引
- def
- f(x,y):
- return
- x*3+2*y
- b = np.fromfunction(f,(5,4),dtype = int)
- b
- array([[ 0,2,4,6],
- [ 3,5,7,9],
- [ 6,8,10,12],
- [ 9,11,13,15],
- [12,14,16,18]])
- b[2,3]
- 12
- b[0:5,1]
- array([ 2,5,8,11,14])
- #当少于轴数的索引被提供时,则被默认为取整个切片
- b[–1]
- array([12,14,16,18])
更改数组形状
最后一个需要给大家介绍的是对数组形状进行更改:
- a = np.arange(10,110,10).reshape(2,5)
- a
- array([[ 10,20,30,40,50],
- [ 60,70,80,90,100]])
- a.shape
- (2,5)
- #展开数组
- a.ravel()
- array([ 10,20,30,40,50,60,70,80,90,100])
- #reshape函数仅改变参数形状,而resize函数则改变数组本身
- a.resize(5,2)
- a
- array([[ 10,20],
- [ 30,40],
- [ 50,60],
- [ 70,80],
- [ 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/