Numpy学习
来源:互联网 发布:股市行情数据接口 编辑:程序博客网 时间:2024/06/05 17:03
链接到Numpy官方文档
本文总结是根据官方文档而来
- Numpy知识点
- 简介与安装
- 基础知识
- Numpy数组的一个例子
- 定义数组
- 基本操作
- 通用函数
- 索引切片迭代
- 形状操纵
- 改变一个数组的形状
- 堆叠不同的数组
- 将一个阵列分隔成几个较小的
- 复制与查看
- 没有完全复制
- 查看或浅复制
- 深复制
- Numpy中的功能和方法概览
Numpy知识点
简介与安装
简介: Numpy是Python用于科学计算的一个库,提供了一个多维数组对象,各种衍生对象(如矩阵),可进行傅里叶变换、基本线性代数、基本统计运算以及随机模拟等等。
Numpy和Python内置的序列之间是有区别的: 1. Numpy数组在创建时具有固定的大小,与Python列表的动态增长不同;2. Numpy数组中的元素都需要相同的数据类型;3. Numpy数组便于对大量数据进行高级数学和其他类型的操作;4. 越来越多的科学和数学的Python软件包正在使用Numpy数组。
Numpy有两大功能: 1. 矢量化;2. 广播。矢量化可使得代码中没有任何明确的循环,索引等,其优点包括:矢量化代码更简洁易读,较少的代码运行通常意味着更少的错误,代码更接近与标准数学符号。广播适用于描述操作隐含元素行为的术语,在Numpy的所有操作中,不仅仅是算数运算,而且还是逻辑的,逐位的,功能性的,具体可在下面的基础知识中了解。
- 安装: Linux系统中 :
- pip3 install numpy
基础知识
Numpy数组的一个例子:
>>>import numpy as np>>>a = np.arange(12).reshape(3,4)#定义一个Numpy的数组a:>>>a.shape#将输出(3,4),代表这是一个三行四列的矩阵>>>a.ndim#数组的维数,比如a就是一个二维的,所以将输出2>>>a.size#数组的元素总数,比如a中共有12个元素>>>a.dtype#描述数组中元素类型,另外NumPy提供了自己的类型。numpy.int32,numpy.int16和numpy.float64是一些例子。此处将输出:int64>>>type(a)#这利用到了Python自身的方法,返回的为a的类型,此处返回:<type'numpy.ndarray'>
定义数组:
有几种方法供我们定义数组:
例如,我们能从一个常规的Python列表或元组中使用array函数创建数组。所创建的数组类型为序列中元素的类型:
>>>import numpy as np>>>a = np.array([2,3,4])>>>aarray([2,3,4])>>>a.dtypedtype('int64')>>>b = np.array([1.2,3.5,5.1])>>>b.dtypedtype('float64')
在定义数组时,我们经常会犯的一个错误:
>>>a = np.array(1,2,3,4) #wrong>>>a = np.array([1,2,3,4]) #right
array能将序列里的序列转换成二维数组,将序列中的序列中的序列转换成三维数组:
>>>b = np.array([(1.5,2,3),(4,5,6)])>>>barray([[1.5,2,3],[4,5,6]])
Numpy提供了一些函数来创建数组,比如有zeros(里面元素全是0)、ones(里面元素全是1)、empty(内容是随机的)【注:所创建数组中元素类型默认是float64】:
>>>np.zeros((2,3))array([[0.,0.,0.], [0.,0.,0.]])>>>np.ones((2,3),dtype=np.int64)#其中,可以在定义时指定元素的类型array([[1,1,1], [1,1,1]])>>>np.empty((2,3))array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260], [ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])
为了创建数字序列,Numpy提供了range函数:
>>>np.arange(10,30,5)#其中,范围在10到30之间(不包括30),步长为5array([10,15,20,25])>>>np.arange(0,2,0.3)array([0.,0.3,0.6,0.9,1.2,1.5,1.8])
通常,我们在定义关于浮点数的序列时,使用linspace方法:
>>>np.linspace(0,2,9)#代表着范围为0到2,中间共有9个元素array([0.,0.25,0.5,0.75,1.,1.25,1.5,1.75,2.])
基本操作:
>>>a = np.array([20,30,40,50])>>>b = np.arange(4)>>>barray([0,1,2,3])>>>c = a-b>>>carray([20,29,38,47])>>b**2array([0,1,4,9])>>>10*np.sin(a)array([9.12945251, -9.88031624, 7.4511316 , -2.62374854])>>>a<35array([True,True,False,False],dtype=bool)
在Numpy中,*代表着矩阵中对应元素之间相乘,dot代表着矩阵的乘法:
>>>a = np.array([[1,1],... [0,1]])>>>b = np.array([[2,0],... [3,4]])>>>a*barray([[2,0], [0,4]])>>>a.dot(b) #或者np.dot(a,b)array([[5,4], [3,4]])
还有操作符 += 和 *= 类似于编程语言中的用法;
>>>a = np.random.randn((2,3))>>>aarray([[ 0.18626021, 0.34556073, 0.39676747], [ 0.53881673, 0.41919451, 0.6852195 ]])>>>a.sun()2.5718191614547998>>>a.min()0.1862602113776709>>>a.max()0.6852195003967595
如果我们要求列上的和或行上的和,可通过设置axis的值实现:
>>>b = np.arange(12).reshape(3,4)>>>barray([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])>>>b.sum(axis=0) #每一行的和,axis=1时为每一列的和array([12, 15, 18, 21])>>>b.min(axis=1)array([0, 4, 8])>>>b.cumsum(axis=1) #每一行上的累加和 array([[ 0, 1, 3, 6], [ 4, 9, 15, 22], [ 8, 17, 27, 38]])
通用函数:
>>> B = np.arange(3)>>> Barray([0, 1, 2])>>> np.exp(B)array([ 1. , 2.71828183, 7.3890561 ])>>> np.sqrt(B)array([ 0. , 1. , 1.41421356])>>> C = np.array([2., -1., 4.])>>> np.add(B, C)array([ 2., 0., 6.])>>> a = np.array([-1.7, -1.5, -0.2, 0.2, 1.5, 1.7, 2.0])>>> np.floor(a) #求不大于x的最大整数array([-2., -2., -1., 0., 1., 1., 2.])
通用函数还有更多:
all, any, apply_along_axis, argmax, argmin, argsort, average, bincount, ceil, clip, conj, corrcoef, cov, cross, cumprod, cumsum, diff, dot, floor, inner, inv, lexsort, max, maximum, mean, median, min, minimum, nonzero, outer, prod, re, round, sort, std, sum, trace, transpose, var, vdot, vectorize, where
索引、切片、迭代
一维数组可以索引、切片、迭代,想pyt4,125,216,343,5126hon中的列表以及其他序列一样:
>>>a = np.arange(10)**3>>>aarray([0,1,8,27,64,125,216,343,512,729])>>>a[2]#输出8>>>a[2:5]array([8,27,64])>>>a[:6:2]=-1000 # 类似于a[0:6:2]=-1000,也就是a[0]=a[2]=a[4]=a[6]=-1000>>>b = np.array([1,5,9])>>>b[::-1] #相当于倒置barray([9,5,1])>>>
多维数组的每一维都有一个索引,这些索引是由逗号分隔的元组组成的:
>>>def f(x,y)... return 10*x+y>>>b = np.fromfunction(f,(5,4),dtype=int)>>>barray([[ 0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33], [40, 41, 42, 43]])>>>b[2,3]23>>>b[0:5,1] #第二列中每一行的值array([ 1, 11, 21, 31, 41])>>>b[ : ,1] #与上个功能一样array([ 1, 11, 21, 31, 41])>>>b[1:3,:] #在第三行到第四行中每一列的值array([[10, 11, 12, 13], [20, 21, 22, 23]])
当提供的索引数量少于轴数时,缺失的索引被认为是完整的切片:
>>>b[-1] #类似于b[-1,:],代表最后一行array([40,41,42,43])
相对于第一个轴进行多维数组的迭代:
>>>for row in b... print(row)[0 1 2 3][10 11 12 13][20 21 22 23][30 31 32 33][40 41 42 43]
如果想对每一个元素进行迭代,可以使用flat这个属性:
>>>for element in b.flat:... print(element)012310111213202122233031323340414243
形状操纵:
改变一个数组的形状:
An array has a shape given by the number of elements along each axis:
>>> a = np.floor(10*np.random.random((3,4)))>>> aarray([[ 2., 8., 0., 6.], [ 4., 5., 1., 1.], [ 8., 9., 3., 6.]])>>> a.shape(3, 4)
数组的形状能够被一些不同的命令改变:
>>>a.ravel() array([ 2., 8., 0., 6., 4., 5., 1., 1., 8., 9., 3., 6.])>>>a.reshape(6,2)array([[ 2., 8.], [ 0., 6.], [ 4., 5.], [ 1., 1.], [ 8., 9.], [ 3., 6.]]>>>a.T # 求a的转置矩阵array([[ 2., 4., 8.], [ 8., 5., 9.], [ 0., 1., 3.], [ 6., 1., 6.]])>>>a.T.shape(4,3)>>>a.shape(3,4)
a.shape与a.resize的区别?
待编辑
在改变数组形状时,如果其中一个维度为-1,则其他维度会自动作出调整:
>>> a.reshape(3,-1)array([[ 2., 8., 0., 6.], [ 4., 5., 1., 1.], [ 8., 9., 3., 6.]])
堆叠不同的数组
几个数组可以沿着不同的轴堆叠在一起:
>>>a = np.floor(10*np.random.random((2,2)))>>> aarray([[ 8., 8.], [ 0., 0.]])>>> b = np.floor(10*np.random.random((2,2)))>>> barray([[ 1., 8.], [ 0., 4.]])>>> np.vstack((a,b))array([[ 8., 8.], [ 0., 0.], [ 1., 8.], [ 0., 4.]])>>> np.hstack((a,b))array([[ 8., 8., 1., 8.], [ 0., 0., 0., 4.]])
column_stack 能将1D数组堆成2D数组,类似于hstack作用于2D数组【注:row_stack与vstack可类比此例】:
>>> from numpy import newaxis>>> np.column_stack((a,b)) # with 2D arraysarray([[ 8., 8., 1., 8.], [ 0., 0., 0., 4.]])>>> a = np.array([4.,2.])>>> b = np.array([3.,8.])>>> np.column_stack((a,b)) # returns a 2D arrayarray([[ 4., 3.], [ 2., 8.]])>>> np.hstack((a,b)) # the result is differentarray([ 4., 2., 3., 8.])>>> a[:,newaxis] # this allows to have a 2D columns vectorarray([[ 4.], [ 2.]])>>> np.column_stack((a[:,newaxis],b[:,newaxis]))array([[ 4., 3.], [ 2., 8.]])>>> np.hstack((a[:,newaxis],b[:,newaxis])) # the result is the samearray([[ 4., 3.], [ 2., 8.]])
将一个阵列分隔成几个较小的:
使用hsplit和vsplit,分别为沿着水平轴和竖直轴分割数组,方法中要指定要返回的等同数组的数量,或者指定分割之后的列:
>>> a = np.floor(10*np.random.random((2,12)))>>> aarray([[ 9., 5., 6., 3., 6., 8., 0., 7., 9., 7., 2., 7.], [ 1., 4., 9., 2., 2., 1., 0., 6., 2., 2., 4., 0.]])>>> np.hsplit(a,3) # Split a into 3[array([[ 9., 5., 6., 3.], [ 1., 4., 9., 2.]]), array([[ 6., 8., 0., 7.], [ 2., 1., 0., 6.]]), array([[ 9., 7., 2., 7.], [ 2., 2., 4., 0.]])]>>> np.hsplit(a,(3,4)) # Split a after the third and the fourth column[array([[ 9., 5., 6.], [ 1., 4., 9.]]), array([[ 3.], [ 2.]]), array([[ 6., 8., 0., 7., 9., 7., 2., 7.], [ 2., 1., 0., 6., 2., 2., 4., 0.]])]
复制与查看
没有完全复制
>>>a = np.arange(12)>>>b = a>>>>b is aTrue>>>b.shape = 3,4 #我们将会发现,如果改变了b的形状,a也会随着改变>>>a.shape(3,4)
可验证:
>>>id(a)148293216>>>id(b)148293216
查看或浅复制:
不同的数组对象可以共享相同的数据。该view方法创建一个查找相同数据的新数组对象:
>>>c = a.view()>>>c is aFalse>>>c.base is a ## c is a view of the data owned by aTrue>>>c.flags.owndataFalse>>>c.shape = 2,6>>>a.shape # a's shape doesn't change(3,4)>>>c[0,4] = 1234 >>>a # a's data changesarray([[ 0, 1, 2, 3],[1234, 5, 6, 7],[ 8, 9, 10, 11]])
Slicing an array returns a view of it:
>>> s = a[ : , 1:3] # spaces added for clarity; could also be written "s = a[:,1:3]">>> s[:] = 10 # s[:] is a view of s. Note the difference between s=10 and s[:]=10>>> aarray([[ 0, 10, 10, 3], [1234, 10, 10, 7], [ 8, 10, 10, 11]])
深复制:
>>>a = a.copy()>>>d is aFalse>>>d.base is a # d doesn't share anything with aFalse>>> d[0,0] = 9999>>> aarray([[ 0, 10, 10, 3], [1234, 10, 10, 7], [ 8, 10, 10, 11]])
Numpy中的功能和方法概览:
- Array Creation(数组创建):
- arange, array, copy, empty, empty_like, eye, fromfile, fromfunction, identity, linspace, logspace, mgrid, ogrid, ones, ones_like, r, zeros, zeros_like
- Conversions(转换):
- ndarray.astype, atleast_1d, atleast_2d, atleast_3d, mat
- Manipulations(操作):
- array_split, column_stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, ndarray.item, newaxis, ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack
- Questions(查询):
- all, any, nonzero, where
- Ordering(排序):
- argmax, argmin, argsort, max, min, ptp, searchsorted, sort
- Operations(基本操作):
- choose, compress, cumprod, cumsum, inner, ndarray.fill, imag, prod, put, putmask, real, sum
- Basic Statistics(基本统计):
- cov, mean, std, var
- Basic Linear Algebra(基本线性回归):
- cross, dot, outer, linalg.svd, vdot
- Numpy学习
- NumPy学习
- numpy学习
- numpy 学习
- numpy学习
- numpy学习
- Numpy 学习
- Numpy学习
- numpy学习
- numpy 学习
- Numpy学习
- numpy学习
- numpy 学习
- numpy学习
- Numpy学习笔记1-numpy入门
- numpy学习笔记二:numpy基础
- Numpy学习笔记2-numpy进阶
- Numpy学习(1)numpy文件存取
- 1-1 Class类的使用
- C++PrimerPlus 知识总结一
- js 根据名称合并单元格
- 【GJJ的日常之再游戏】(数组排序去重)
- Java学习笔记之Hibernate-用注解方式实现一对多双向关联
- Numpy学习
- Reactor模式详解
- RMQ模板题
- C#委托和事件 EventHandle和EventArgs
- (hdu 1579)Function Run Fun (记忆化搜索)
- 基于官方的yum源安装MySQL
- kicksrart
- leetcode 2. Add Two Numbers
- 深入剖析java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue