在Python中,使用list可以保存一组值,可以作为数组使用,但是比较浪费内存和时间。类似的array模块,不支持多维,也没有各种函数运算,因此也极其不方便。

为解决这一问题,Python提供了Numpy模块,支持N维数组运算、处理大型矩阵、广播函数库、矢量运算等。

1.1函数库的导入

在使用这个库的第一步,先导入numpy模块,根据Python社区的习惯,代码如下:

  1. >>>import numpy as np

1.2数组创建

1.2.1Array函数

一般情况下,我们可以使用array函数把Python中的列表或元组转换成数字,Array(x) 所需的 x参数是一个用逗号隔开的值表。如果不提供参数,则创建一个长度为 0 的数组。

示例代码如下:

  1. >>>np.array((1,2,3,4)) #列表转换为数组
    [1 2 3 4]
  2.  
  3. >>>np.array(range(4)) #range对象转换成数组
    [0 1 2 3]

注明:带>>>表示输入代码,其余的是print的结果,下文中不再说明

1.2.2常用生成数组的方法

有时候,我们可能需要创建一些比较规则的数组,比如1到100的等差为1的数组,如果使用上面的方法显得太麻烦,这时候,我们可以使用arange(a,b,c)函数,其中a,b,c参数分别对应起始数值和元素差值,但取值时不取到b,示例代码如下:

  1. >>>np.arange(0, 2, 0.5)
    [0. 0.5 1. 1.5]

有时不一定知道元素之间精确的差值,而又想获取一个范围内某长度的数组,用linspace(a,b,c)函数就可以完成这个任务,其中a,b,c分别对应起始数值和元素个数,示例代码如下:

  1. >>>np.linspace(0,2,5)
    [0. 0.5 1. 1.5 2. ]

logspace函数和linspace函数类似,a,b是起始数值,c指取值个数,假设x是a到b的其中一个值,则元素取值为10^x,也就是说,假设a,b分别取值为0和2时,对应的首尾元素是1(10^0)和100(10^2),示例代码如下:

  1. >>>np.logspace(0,2,10)
  2. [ 1. 1.66810054 2.7825594 4.64158883 7.74263683
  3. 12.91549665 21.5443469 35.93813664 59.94842503 100. ]

还有生成随机数数组,范围是0到1,示例如下:

  1. >>>np.random.rand(10)
  2. [0.33234665 0.81082701 0.36265294 0.52809782 0.14785796 0.42038477
  3. 0.43077405 0.10493567 0.59562374 0.64912364]

1.2.3生成常用矩阵

一般情况下,使用矩阵可能需要全零全一这类的矩阵作为初始值,类似matlab,python也有这样的函数可以调用,下面分别示例全0,全1,单位矩阵和空矩阵的代码:

  1. >>>np.zeros((3,3)) #全0二维数组
  2. [[0. 0. 0.]
  3. [0. 0. 0.]
  4. [0. 0. 0.]]
  5.  
  6. >>>np.ones((3,3)) #全1二位数组
  7. [[1. 1. 1.]
  8. [1. 1. 1.]
  9. [1. 1. 1.]]
  10.  
  11. >>>np.identity(3) #单位矩阵
  12. [[1. 0. 0.]
  13. [0. 1. 0.]
  14. [0. 0. 1.]]
  15.  
  16. >>>np.empyt((3,3)) #空数组,只申请空间,元素值不确定,每次运行结果可能不同
  17. [[0.00000000e+000 2.35636847e-310 2.35636847e-310]
  18. [2.35636847e-310 2.35636847e-310 2.35636847e-310]
  19. [2.35636847e-310 2.35636847e-310 3.95252517e-322]]

1.3数组操作

1.3.1获取数组属性

  1. >>>a=np.array(([1,2,3],[4,5,6]))
  2. >>>a
  3. [[1 2 3]
  4. [4 5 6]]
  5. >>>a.ndim #数组的维数
  6. 2
  7. >>>a.shape #数组的维度,返回一个元素,相当于行和列
  8. (2, 3)
  9. >>>a.size #数组元素个数
  10. 6
  11. >>>a.itemsize #数组中每个元素字节大小
  12. 8
  13. >>>a.data #缓冲区,一般不需要用
  14. <memory at 0x2b7990872e48>

1.3.2改变数组大小

当已知一个一维数组时,可以用下面方法改变数组的维度

  1. >>>a=np.array(range(10))
  2. >>>a
  3. [0 1 2 3 4 5 6 7 8 9]
  4. >>>a.shape=2,5 #改成2行5列
  5. >>>a
  6. [[0 1 2 3 4]
  7. [5 6 7 8 9]]
  8. >>>a.shape=5,-1 #改成5行,自动计算列
  9. >>>a
  10. [[0 1]
  11. [2 3]
  12. [4 5]
  13. [6 7]
  14. [8 9]]
  15. >>>b=a.reshape(2,5) #改变a的行列并返回新数组
  16. >>>b
  17. [[0 1 2 3 4]
  18. [5 6 7 8 9]]

1.3.3访问元素

访问元素一般比较简单,代码如下:

  1. >>>a=np.arange(1,10,1).reshape(3,3)
  2. >>>a
  3. [[1 2 3]
  4. [4 5 6]
  5. [7 8 9]]
  6. >>>a[0] #第0行
  7. [1 2 3]
  8. >>>a[:,0] #第0行
  9. [1 4 7]
  10. >>>a[0][0] #第0行0列的元素
  11. 1

元素也可以同时访问多个,也可以修改多个,代码如下

  1. >>>a=np.arange(1,10,1)
  2. >>>a
  3. [1 2 3 4 5 6 7 8 9]
  4. >>>index=np.array([1,5])
  5. index
  6. [1 5]
  7. >>>a[index] #查看多个元素值
  8. [2 6]
  9. >>>a[index]=[11,13] #修改多个元素值
  10. >>>a
  11. [ 1 11 3 4 5 13 7 8 9]

这里再介绍一个切片操作,代码如下:

  1. >>>a=np.arange(10)
  2. >>>a
  3. [0 1 2 3 4 5 6 7 8 9]
  4. >>>a[::-1] #反向切片
  5. [9 8 7 6 5 4 3 2 1 0]
  6. >>>a[::2] #隔一个取一个
  7. [0 2 4 6 8]
  8. >>>a[:4] #前4个元素
  9. [0 1 2 3]

1.4数组运算

1.4.1数组与数值的运算

python的数值计算中,基本运算有加、减、乘、除、整除、幂运算、余数等,这些运算在数组中同样适用。数组和数值的运算,是数组中每一位元素分别和数值做计算,本文选用加法和乘法示例,其他的不再一一列举,代码如下:

  1. >>>x=np.array(range(5))
  2. >>>x
  3. [0 1 2 3 4]
  4. >>>x+2
  5. [2 3 4 5 6]
  6. >>>x*2
  7. [0 2 4 6 8]

1.4.2数组和数组的运算

数组间的运算,如c=a*b,表示a中每一位元素乘以b中的每一列元素,下面示例乘法和加法的代码:

  1. >>>a=np.arange(1,4,1)
  2. >>>a
  3. [1 2 3]
  4. >>>b=np.arange(1,10,1).reshape(3,3)
    >>>b
  5. [[1 2 3]
  6. [4 5 6]
  7. [7 8 9]]
  8. >>>a*b #乘法运算
  9. [[ 1 4 9]
  10. [ 4 10 18]
  11. [ 7 16 27]]
  12. >>>a+b #加法运算
  13. [[ 2 4 6]
  14. [ 5 7 9]
  15. [ 8 10 12]]

1.4.3向量内积

一维向量求内积非常简单,将对应元素相乘后求和,一维数组也可以和二维数组求内积,内积调用代码为a.dot(b)或np.dot(a,b),示例代码如下:

  1. >>>a=np.array((1,2,3))
  2. >>>b=np.array((3,3,3))
  3. >>>c=np.arange(1,10,1).reshape(3,3)
  4. >>>np.dot(a,b) #向量内积
  5. 18
  6. >>>np.dot(c,a) #c中的每一行和a计算内积
  7. [14 32 50]
  8. >>>np.dot(a,c) #a和c中的每一列计算内积
  9. [30 36 42]

多维数组之间也可以求内积,设有多维数组a和多维数组b,若a(如3*2)的列和b(2*4)的行一致,则可计算内积,得到新的数组c(3*4),c的行列分别为a的行和b的列,c中的第i行j列的元素值是a中i行和b中j列的向量做内积求得的。代码如下:

  1. >>>a=np.arange(1,9,1).reshape(2,4)
  2. >>>b=np.arange(1,7,1).reshape(3,2)
  3. >>>b
  4. [[1 2]
  5. [3 4]
  6. [5 6]]
  7. >>>a
  8. [[1 2 3 4]
  9. [5 6 7 8]]
  10. >>>np.dot(b,a)
  11. [[11 14 17 20]
  12. [23 30 37 44]
  13. [35 46 57 68]]

1.4.4数组转置

二维数组转置后行列位置发生变化,一维不变,这里只示例二维转置的效果,代码如下:

  1. >>>a=np.arange(1,10,1).reshape(3,3)
  2. >>>a
  3. [[1 2 3]
  4. [4 5 6]
  5. [7 8 9]]
  6. >>>a.T
  7. [[1 4 7]
  8. [2 5 8]
  9. [3 6 9]]

1.5调用函数

1.5.1计算所有元素值

设x是一个任意维数组,则一般有以下函数可以使用,调用后对每个元素值都做计算

  • np.sin(x)  求正弦值
  • np.cos(x)  求余弦值
  • np.round(x)  四舍五入
  • np.floor(x)  向下取整
  • np.ceil(x)  向上取整

本文示例第一个和最后一个函数

  1. >>>a=np.arange(1,10,1).reshape(3,3)
  2. >>>b=np.sin(a)*10
  3. >>>np.sin(a) #a求正弦值
  4. [[ 0.84147098 0.90929743 0.14112001]
  5. [-0.7568025 -0.95892427 -0.2794155 ]
  6. [ 0.6569866 0.98935825 0.41211849]]
  7. >>>b
  8. [[ 8.41470985 9.09297427 1.41120008]
  9. [-7.56802495 -9.58924275 -2.79415498]
  10. [ 6.56986599 9.89358247 4.12118485]]
  11. >>>np.ceil(b) #b向上取整
  12. [[ 9. 10. 2.]
  13. [-7. -9. -2.]
  14. [ 7. 10. 5.]]

1.5.2不同维度上的元素进行计算

介绍函数前,先说明几个变量,x表示数组,axis=0表示纵向或者说每列,axis=1表示横向或者每行。以下列举一些用法类似的函数,并选择其中一个函数用代码示例

  • np.sum  #求和
  • np.mean  #求算术平均值
  • np.average  #求平均值,如果参数加上权重则为加权平均值
  • np.max  #求最大值
  • np.std  #求标准差
  • np.var  #求方差
  • np.sort  #排序,不标明axis的值时,默认axis为1
  1. >>>a=np.array(([1,2,3],[4,5,6]))
  2. >>>np.sum(a) #全部元素和
  3. 21
  4. >>>np.sum(a,0) #纵向求和
  5. [5 7 9]
  6. >>>np.sum(a,axis=1) #横向求和
  7. [6 15]

1.6广播

ufunc是一种能对数组的每个元素进行操作的函数,如前面提到的np.sin等函数。当我们使用ufunc函数对两个数组进行计算时,ufunc函数会对这两个数组的对应元素进行计算,因此它要求这两个数组有相同的大小(shape相同)。如果两个数组的shape不同的话,会进行如下的广播(broadcasting)处理:

  1. 让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐
  2. 输出数组的shape是输入数组shape的各个轴上的最大值 (数组的维数称为秩,秩是描述轴的数量,轴表示一个线性数组)
  3. 如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错
  4. 当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值

上述4条规则理解起来可能比较费劲,让我们来看一个实际的例子。

  1. >>>a=np.arange(0, 60, 10).reshape(-1, 1)
  2. >>>b=np.arange(0,6)
  3. >>>a
  4. [[ 0]
  5. [10]
  6. [20]
  7. [30]
  8. [40]
  9. [50]]
  10. >>>b
  11. [0 1 2 3 4 5]
  12. >>>a+b #广播
  13. [[ 0 1 2 3 4 5]
  14. [10 11 12 13 14 15]
  15. [20 21 22 23 24 25]
  16. [30 31 32 33 34 35]
  17. [40 41 42 43 44 45]
  18. [50 51 52 53 54 55]]
  19. >>>a*b
  20. [[ 0 0 0 0 0 0]
  21. [ 0 10 20 30 40 50]
  22. [ 0 20 40 60 80 100]
  23. [ 0 30 60 90 120 150]
  24. [ 0 40 80 120 160 200]
  25. [ 0 50 100 150 200 250]]

1 Numpy-科学计算的更多相关文章

  1. python安装numpy科学计算模块

    解决两个问题: (1)Import Error: No module named numpy (2)Python version 2.7 required, which was not found i ...

  2. numpy科学计算库的基础用法,完美抽象多维数组(原创)

    #起别名避免重名 import numpy as np #小技巧:print从外往内看==shape从左往右看 if __name__ == "__main__": print(' ...

  3. Python的工具包[0] -> numpy科学计算 -> numpy 库及使用总结

    NumPy 目录 关于 numpy numpy 库 numpy 基本操作 numpy 复制操作 numpy 计算 numpy 常用函数 1 关于numpy / About numpy NumPy系统是 ...

  4. Numpy科学计算

    NumPy介绍   NumPy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组. NumPy支持常见的数组和矩阵操作.对于同样的数值计算任务,使用Nu ...

  5. Numpy科学计算从放弃到入门

    目录 一.什么是Numpy ndarray对象 相关文档 二.如何创建数组 三.如何访问数组 下标索引 切片索引 布尔型索引 整数索引 方形索引 四.如何做算数运算 五.如何使用统计函数 六.数组转置 ...

  6. python numpy 科学计算通用函数汇总

    import numpy as np #一元函数 #绝对值计算 a = -1b = abs(a)print(b)输出: 1 #开平方计算 a = 4b = np.sqrt(a)print(b)输出: ...

  7. Numpy科学计算工具

    Numpy初探 Numpy基础数据结构 Numpy数组是一个多维数组,称为ndarray.其由两部分组成: 实际的数据 描述这些数据的原数据 导入该库: import numpy as np 多维数组 ...

  8. python numpy科学计算和数据分析的基础包

    import numpy as np #创建ndarray# data1 = [6, 5, 7, 1, 3]# arrl = np.array(data1)# print(arrl)#多维列表创建nd ...

  9. ubuntu安装Python环境以及科学计算环境

    参考:http://blog.csdn.net/a1311543690/article/details/ 1.sudo apt-get install python-pip pip是Python的一个 ...

  10. python学习--大数据与科学计算第三方库简介

    大数据与科学计算  库名称 简介 pycuda/opencl GPU高性能并发计算 Pandas python实现的类似R语言的数据统计.分析平台.基于NumPy和Matplotlib开发的,主要用于 ...

随机推荐

  1. XBMC源代码分析 4:视频播放器(dvdplayer)-解码器(以ffmpeg为例)

    XBMC分析系列文章: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 本文我们分析XBMC中视 ...

  2. Chipmunk碰撞形状:cpShape

    目前有3种碰撞类型: 圆(Circles):最快并且最简单的碰撞形状 线段(Line segment):主要用于静态形状.可以表示斜线(Can be beveled in order to give ...

  3. [Django] 单元测试小记

    从前很少写单元测试了,特别是web应用.最近不知不觉喜欢起来这个事情了,发现单元测试对于软件的模块,正交性有很大促进作用,因为函数,模块写的不合理,单元测试写起来就麻烦的多呀.公司的项目一直都是用Dj ...

  4. 《java入门第一季》之面向对象(修饰符的概念和总结)

    还是由于eclipde等ide的强大功能,会自动提示你修饰符是否可行.所以对修饰符的作用了解即可: 修饰符:         权限修饰符:private,默认的,protected,public    ...

  5. 衡量android开发者水平的面试问题-android学习之旅(91)

    一般面试时间短则30分钟,多则1个小时,这么点时间要全面考察一个人难度很大,需要一些技巧,这里我不局限于回答题主的问题,而是分享一下我个人关于如何做好Android技术面试的一些经验: 面试前的准备 ...

  6. zTree的调用设使用(跨两个系统,两类技术实现的项目案例SpringMVC+Spring+MyBatis和Struts2+Spring+ibatis框架组合)

    1.从zTree官网上下载zTree的包,zTree的官方网址是:http://www.ztree.me/v3/main.php#_zTreeInfo 2.引入zTree所需的依赖,例如(jQuery ...

  7. 使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)

    使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Netw ...

  8. Android性能优化典例(二)

    1.使用 Maven 依赖方案代替使用导入jar包方案 如果项目中需要用到第三方jar包,常用的做法是去网上下载后然后放入libs文件夹,再添加到项目依赖,不过,在Android Studio已经不推 ...

  9. 关于hashCode与equals

    首先我得说明,在我们自己写得类中你可以复写这两个方法,此时从语法的角度来说,他们没关系. 在object中 public native int hashCode(); public boolean e ...

  10. Volley解析之表单提交篇

    要实现表单的提交,就要知道表单提交的数据格式是怎么样,这里我从某知名网站抓了一条数据,先来分析别人提交表单的数据格式.  数据包: Connection: keep-alive Content-Len ...