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

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

1.1函数库的导入

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

>>>import numpy as np 

1.2数组创建

1.2.1Array函数

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

示例代码如下:

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

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

1.2.2常用生成数组的方法

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

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

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

>>>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),示例代码如下:

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

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

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

1.2.3生成常用矩阵

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

>>>np.zeros((3,3))  #全0二维数组
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]] >>>np.ones((3,3)) #全1二位数组
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]] >>>np.identity(3) #单位矩阵
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]] >>>np.empyt((3,3)) #空数组,只申请空间,元素值不确定,每次运行结果可能不同
[[0.00000000e+000 2.35636847e-310 2.35636847e-310]
[2.35636847e-310 2.35636847e-310 2.35636847e-310]
[2.35636847e-310 2.35636847e-310 3.95252517e-322]]

1.3数组操作

1.3.1获取数组属性

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

1.3.2改变数组大小

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

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

1.3.3访问元素

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

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

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

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

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

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

1.4数组运算

1.4.1数组与数值的运算

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

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

1.4.2数组和数组的运算

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

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

1.4.3向量内积

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

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

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

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

1.4.4数组转置

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

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

1.5调用函数

1.5.1计算所有元素值

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

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

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

>>>a=np.arange(1,10,1).reshape(3,3)
>>>b=np.sin(a)*10
>>>np.sin(a) #a求正弦值
[[ 0.84147098 0.90929743 0.14112001]
[-0.7568025 -0.95892427 -0.2794155 ]
[ 0.6569866 0.98935825 0.41211849]]
>>>b
[[ 8.41470985 9.09297427 1.41120008]
[-7.56802495 -9.58924275 -2.79415498]
[ 6.56986599 9.89358247 4.12118485]]
>>>np.ceil(b) #b向上取整
[[ 9. 10. 2.]
[-7. -9. -2.]
[ 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
>>>a=np.array(([1,2,3],[4,5,6]))
>>>np.sum(a) #全部元素和
21
>>>np.sum(a,0) #纵向求和
[5 7 9]
>>>np.sum(a,axis=1) #横向求和
[6 15]

1.6广播

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

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

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

>>>a=np.arange(0, 60, 10).reshape(-1, 1)
>>>b=np.arange(0,6)
>>>a
[[ 0]
[10]
[20]
[30]
[40]
[50]]
>>>b
[0 1 2 3 4 5]
>>>a+b #广播
[[ 0 1 2 3 4 5]
[10 11 12 13 14 15]
[20 21 22 23 24 25]
[30 31 32 33 34 35]
[40 41 42 43 44 45]
[50 51 52 53 54 55]]
>>>a*b
[[ 0 0 0 0 0 0]
[ 0 10 20 30 40 50]
[ 0 20 40 60 80 100]
[ 0 30 60 90 120 150]
[ 0 40 80 120 160 200]
[ 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. 仿滴滴抢单倒计时的Demo

    滴滴里面有一个下单完成之后等待界面的倒计时转圈的视图... 就是这个... 原理: 通过CAShapeLayer层添加到自己自定义的视图layer上... 设置ShapeLayer的path... 他 ...

  2. (三十)PickerView文字和随机数的使用

    PickerView用于展示供选择的内容(例如日期选取.点菜等). 有三种情况: 1.每一列都是独立的选取 2.右边的列受到左边列的影响 3.包含图片 PickerView和TableView类似,通 ...

  3. R--线性回归诊断(二)

    线性回归诊断--R [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt   勿忘初心  无畏未来 作为一个初学者,水平有限,欢迎交流指正. R--线性回 ...

  4. iOS开发经验相关知识

    一. iPhone Size 手机型号 屏幕尺寸 iPhone 4 4s 320 * 480 iPhone 5 5s 320 * 568 iPhone 6 6s 375 * 667 iphone 6 ...

  5. 【Qt编程】Qt学习之窗口间的相互切换

    在用Qt设计GUI时,经常要设计两个窗口之间的相互切换,即可以从一个窗口跳转到另一个窗口,然后又从另一个窗口跳转回原窗口.下面我们来介绍具体的实现方法: 工程建立及功能描述: 首先,我们建立Qt  G ...

  6. Java泛型和通配符那点事

    泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...

  7. 【Qt编程】QWT在QtCreator中的安装与使用

    由于导师项目的需要,需要画图,二维+三维.三维图我用的是Qt+opengl,二维图我决定使用qwt工具库来加快我的项目进展,毕竟还有期末考试.关于Qt+opengl的使用有时间的话以后再介绍.     ...

  8. 网站开发进阶(四)Tomcat Server处理一个http请求的过程

    Tomcat Server处理一个http请求的过程 假设来自客户的请求为: http://localhost:8080/wsota/wsota_index.jsp 1) 请求被发送到本机端口8080 ...

  9. 苹果新的编程语言 Swift 语言进阶(十三)--类型检查与类型嵌套

    一 类型检查 1. 类型检查操作符 类型检查用来检查或转换一个实例的类型到另外的类型的一种方式. 在Swift中,类型检查使用is和as操作符来实现. is操作符用来检查一个实例是否是某种特定类型,如 ...

  10. 【Android 应用开发】Android 开发错误集锦

    1. eclipse的Device中不显示手机 在eclipse中连接不上手机,出现adb server didn't ACK  fail to start daemon 错误. 出现这种原因是因为a ...