【转载】图解NumPy
1. 读写文件
# 写:函数将数据a存储到test.txt文件中
np.savetxt('test.txt', a)
# 读:表示读取test.csv文件
x, y = np.loadtxt('test.csv',
delimiter=',', # 分隔符
usecols=(6,7), # 取哪几列数据
unpack=True) # 分拆存储不同列的数据,即分别将第6列与第7列数据赋值给变量x,y
2. 内建向量/矩阵
zeros(shape)
np.zeros((2, 3)) # output:
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
ones(shape)
arange(n)
arange函数类似于python的range函数,通过指定开始值、终值和步长来创建一维数组,注意数组不包括终值:
np.arange(2, 10, dtype=np.float)
# [ 2. 3. 4. 5. 6. 7. 8. 9.]
linspace()
linspace函数通过指定开始值、终值和元素个数来创建一维数组,可以通过endpoint关键字指定是否包括终值,缺省设置是包括终值:
np.linspace(1., 4., 6)
# array([ 1., 1.6, 2.2, 2.8, 3.4, 4. ])
logspace()
logspace函数和linspace类似,不过它创建等比数列,下面的例子产生1(100)到100(102)、有20个元素的等比数列:
random.random()
3. 切片操作
索引和切片功能在操作矩阵时变得更加有用。可以在不同维度上使用索引操作来对数据进行切片。
你也许会对如何创建a这样的数组感到好奇,数组a实际上是一个加法表,纵轴的值为0, 10, 20, 30, 40, 50;横轴的值为0, 1, 2, 3, 4, 5。纵轴的每个元素都和横轴的每个元素求和,就得到图中所示的数组a。
np.arange(0, 60, 10).reshape(-1, 1) + np.arange(0, 6)
array([[ 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[(0,1,2,3,4),(1,2,3,4,5)]
用于存取数组的下标和仍然是一个有两个元素的组元,组元中的每个元素都是整数序列,分别对应数组的第0轴和第1轴。从两个序列的对应位置取出两个整数组成 下标: a[0,1], a[1,2], ..., a[4,5]。
a[3:, [0, 2, 5]]
下标中的第0轴是一个范围,它选取第3行之后的所有行;第1轴是整数序列,它选取第0, 2, 5三列。
a[mask, 2]
下标的第0轴是一个布尔数组,它选取第0,2,5行;第1轴是一个整数,选取第2列。
4. 聚合函数
4.1. 向量
除了min,max和sum等函数,还有mean(均值),prod(数据乘法)计算所有元素的乘积,std(标准差),等等。上面的所有例子都在一个维度上处理向量。除此之外,NumPy之美的一个关键之处是它能够将之前所看到的所有函数应用到任意维度上。
4.2. 矩阵
我们可以像聚合向量一样聚合矩阵:
注意:axis的用法并不等同于 row, column... 的顺序。
5. 矩阵的转置和重构
重构:只需将矩阵所需的新维度传入即可。也可以传入-1,NumPy可以根据你的矩阵推断出正确的维度:
注意:数组a和d其实共享数据存储内存区域,因此修改其中任意一个数组的元素都会同时修改另外一个数组的内容:
6. 常用操作API
#加权平均,v作为权重参数
np.average(c, weights=v)
#算术平均
np.mean(c)
#取值范围
np.max(c)
np.min(c)
#ptp函数返回最大值与最小值之间的差值
np.ptp(c)
#median函数返回中位数
np.median(c)
#var方差
np.var(c)
#diff函数返回一个由相邻数组元素的差值构成的数组
np.diff(c)
#std函数计算标准差
np.std(c)
#where函数根据指定的条件返回所有满足条件的数组元素的索引值
idx = np.where(c>6)
# take函数按照索引值从数组中取出相应的元素,np.take(c,np.where(c>6))
data = np.take(idx)
#argmin返回是c数组中最小元素的索引值,argmax返回最大值索引值
np.argmin(c)
np.argmax(c)
#maximum函数可返回多个数组里的各最大值
np.maximum(a, b, c)
#同理minximum返回最小值
#exp函数可计算每个数组元素的指数
np.exp(x)
#linspace(s, e, [n])函数起始s, 终止e,个数n(可选),返回一个元素值在指定的范围内均匀分布的数组
np.linspace(-1, 0, 5)
7. 应用实例
7.1. 生成向量、矩阵
vec = np.linspace(-2,2,100) # 产生直线数据
myZero = np.zeros([3,5]) # 3*5的全0矩阵
myZero = np.ones([3,5]) # 3*5的全1矩阵
myRand = np.random.rand(3,4) # 3行4列的0~1之间的随机数矩阵
myEye = np.eye(3) # 3*3的矩阵
7.2. 数组数据的提取与过滤
mymatrix.shape
--> 矩阵的行数和列数: (3, 4)
mymatrix1[0] # 按行切片
--> 按行切片: [[1 2 3]]
mymatrix1.T[0] # 按列切片
--> 按列切片: [[1 4 7]]
mymatrix = mymatrix1.copy() # 矩阵的复制
mymatrix < mymatrix1.T # 按位比较
--> 矩阵元素的比较:
[[False True True]
[False False True]
[False False False]]
clip()
将所有比给定最大值还大的元素全部设为给定的最大值,而所有比给定最小值还小的元素全部设定为给定的最小值。
a = np.arange(5)
a.clip(1,3) # 输出: array([1, 1, 2, 3, 3])
trim_zeros():去掉一维数组中开头和末尾为0的元素
compress()
返回一个根据给定条件筛选后的数组
a = np.arange(5)
a.compress(a > 2) # array([3, 4])
7.3. 四则运算
newMat = myOnes + myEye # 元素的加和减(条件是矩阵的行数和列数必须相同)
newMat = 3 * matrix # 矩阵乘常数
newMat = matrix.sum() # 矩阵全部元素求和
newMat = power(matrix1, 2) # 矩阵各元素的n次幂:n=2
'''
矩阵各元素的积:矩阵的点乘同维对应元素的相乘。
当矩阵的维度不同时,会根据一定的广播将维数扩
充到一致的形式
'''
matrix1 = mat([[1,2,3],[4,5,6],[7,8,9]])
matrix2 = 1.5 * ones([3,3])
newMat = multiply(matrix1, matrix2)
--> 输出结果:
[[ 1.5 3. 4.5]
[ 6. 7.5 9. ]
[ 10.5 12. 13.5]]
# 矩阵乘矩阵
matrix1 = mat([[1,2,3],[4,5,6],[7,8,9]])
matrix2 = mat([[1],[2],[3]])
newMat = matrix1 * matrix2
--> 输出结果:
[[14]
[32]
[50]]
7.3.1. multiply()
对应位置相乘(同 *
星乘)。如有必要,会进行 broadcast
之后(两者有相同的维数)再进行处理。
A = np.arange(1,5).reshape(2,2)
B = np.arange(0,4).reshape(2,2)
np.multiply(A,B) # array([[0, 2],[6, 12]])
对于矩阵,与ndarray处理相同
np.multiply(np.mat(A),np.mat(B))
--> matrix([[ 0, 2],
[ 6, 12]])
7.3.2. 星乘(*)
ndarray: 星乘表示矩阵内各对应位置相乘(同 np.multiplyt()
)。
a = numpy.array([[1,2],
[3,4]])
b = numpy.array([[5,6],
[7,8]])
a * b
>>> array([[ 5, 12],
[21, 32]])
matrix: 执行矩阵乘法运算(内积)
np.matrix(a) * np.matrix(b)
--> matrix([[19, 22],
[43, 50]])
7.3.3. 点乘(.dot)
数组秩不为1的场景
如果 a 和 b都是 1-D arrays,它的作用是计算内积。(不进行复共轭)
点乘表示求矩阵内积,二维数组称为矩阵积 mastrix product
。
numpy.dot(a,b)
>>> array([[19, 22],
[43, 50]])
numpy.dot(b,a)
>>> array([[23, 34],
[31, 46]])
数组秩为1的场景
C = np.arange(1,4)
D = np.arange(0,3)
np.dot(C,D) #对应位置相乘,再求和: 8
7.4. 阶乘
prod()
a = np.arange(1,5)
a.prod() # 输出: 24
cumprod()
a.cumprod() # array([ 1, 2, 6, 24], dtype=int32)
7.5. 判断数组数据的正负性
sign()
返回数组中每个元素的正负符号
c = np.linspace(-2, 2, 5) # array([-2., -1., 0., 1., 2.])
np.sign(c) # array([-1., -1., 0., 1., 1.])
piecewise()
来获取数组元素的正负。piecewise函数可以分段取值
np.piecewise(c, [c<-1, c>1], [-2, 1])
7.6. 矩阵的变换
a = np.arange(6).reshape(2,3) # reshape
# 矩阵的转置
newMat = matrix1.T
matrix1.transpose() # 转置(改写原矩阵)
from numpy import linalg
A = mat([[1,2,3],[4,5,6],[7,8,9]])
invA = linalg.inv(A) # 矩阵的逆
n = linalg.det(A) # 矩阵的行列式运算
n = linalg.matrix_rank(A) # 矩阵的秩
7.7. 可逆矩阵求解
A = np.mat([[1,2,4,5,7],[9,12,11,8,2],[6,4,3,2,1],[9,1,3,4,5],[0,2,3,4,1]])
b = np.mat([1, 0, 1, 0, 1])
S = linalg.solve(A, b.T)
# 输出结果:
matrix([[-0.0270936 ],
[ 1.77093596],
[-3.18472906],
[ 1.68965517],
[ 0.25369458]])
相关性
#协方差,描述两个变量共同变化趋势
c = np.cov(a,b)
#diagonal返回对角线上的元素
c.diagonal()
#trace计算矩阵的迹,即对角线上元素之和
c.trace()
#corrcoef函数计算相关系数(或者更精确地,相关系数矩阵)
np.corrcoef(a, b)
8. 附录
8.1. 从字符串读取ndarray
使用frombuffer, fromstring, fromfile等函数可以从字节序列创建数组,下面以fromstring为例。
Python的字符串实际上是字节序列,每个字符占一个字节,因此如果从字符串s创建一个8bit的整数数组的话,所得到的数组正好就是字符串中每个字符的ASCII编码:
如果从字符串s创建16bit的整数数组,那么两个相邻的字节就表示一个整数,把字节98和字节97当作一个16位的整数,它的值就是98*256+97 = 25185
。可以看出内存中是以little endian(低位字节在前)方式保存数据的。
>>> np.fromstring(s, dtype='int16')
array([25185, 25699, 26213, 26727], dtype=int16)
如果把整个字符串转换为一个64位的双精度浮点数数组,那么它的值是:
>> np.fromstring(s, dtype="float")
array([8.54088322e+194])
显然这个例子没有什么意义,但是可以想象如果我们用C语言的二进制方式写了一组double类型的数值到某个文件中,那们可以从此文件读取相应的数据,并通过fromstring函数将其转换为float64类型的数组。
我们可以写一个Python的函数,它将数组下标转换为数组中对应的值,然后使用此函数创建数组:
>>> def func(i):
... return i % 4 + 1
...
>>> np.fromfunction(func, (10,))
array([1., 2., 3., 4., 1., 2., 3., 4., 1., 2.])
fromfunction函数的第一个参数为计算每个数组元素的函数,第二个参数为数组的大小(shape),因为它支持多维数组,所以第二个参数必须是一个序列,本例中用(10,)创建一个10元素的一维数组。
下面的例子创建一个二维数组表示九九乘法表,输出的数组a中的每个元素a[i, j]都等于func2(i, j):
8.2. 结构数组
在C语言中我们可以通过struct关键字定义结构类型,结构中的字段占据连续的内存空间,每个结构体占用的内存大小都相同,因此可以很容易地定义 结构数组。和C语言一样,在NumPy中也很容易对这种结构数组进行操作。只要NumPy中的结构定义和C语言中的定义相同,NumPy就可以很方便地读 取C语言的结构数组的二进制数据,转换为NumPy的结构数组。
假设我们需要定义一个结构数组,它的每个元素都有name, age和weight字段。在NumPy中可以如下定义:
8.3. 内存结构
下面让我们来看看ndarray数组对象是如何在内存中储存的。如图2.3所示,关于数组的描述信息保存在一个数据结构中,这个结构引用两个对象:一块用于保存数据的存储区域和一个用于描述元素类型的dtype对象。
【转载】图解NumPy的更多相关文章
- 图解Numpy的tile函数
Numpy的tile(A, reps)函数,就是将原矩阵横向.纵向地复制.tile是瓷砖的意思,顾名思义,这个函数就是把数组像瓷砖一样铺展开来. 举个例子,原矩阵: 横向铺展: 纵向铺展: 横向铺 ...
- [转载]图解程序员必须掌握的Java常用8大排序算法
这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,分享给大家一起学习. 分类1)插入排序(直接插入排序.希尔排 ...
- [转]Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate()
Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate() 觉得有用的话,欢迎一起讨论相互学习~Follow Me ...
- Python教学相关资料
Python教学调查链接 一.专题 1.绘图 如何开始使用Python来画图 Python画图总结 2.科学计算与数据分析 3.可视化 4.网络爬虫 5. 做笔记 Python-Jupyter Not ...
- 【转载】图解:二叉搜索树算法(BST)
原文:图解:二叉搜索树算法(BST) 摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!“岁月极美,在于它必然的流逝”“春花 秋月 夏日 冬雪”— ...
- RHEL 6.3安装(超级详细图解教程)[转载]
附:RHEL6.3下载地址 32位:http://rhel.ieesee.net/uingei/rhel-server-6.3-i386-dvd.iso 64位:http://rhel.iee ...
- 【转载】python安装numpy和pandas
转载:原文地址 http://www.cnblogs.com/lxmhhy/p/6029465.html 最近要对一系列数据做同比比较,需要用到numpy和pandas来计算,不过使用python安装 ...
- (转载)详细图解mongodb下载、安装、配置与使用
记得在管理员模式下运行CMD,否则服务将启动失败 转载:http://blog.csdn.net/boby16/article/details/51221474 详细图解,记录 win7 64 安装m ...
- NumPy使用图解教程
NumPy是Python中用于数据分析.机器学习.科学计算的重要软件包.它极大地简化了向量和矩阵的操作及处理.python的不少数据处理软件包依赖于NumPy作为其基础架构的核心部分(例如scikit ...
随机推荐
- COCO数据集提取特定多个类并在YOLO-V3上训练
先占个地方,有空再写 ` import os Dir = './coco_class_6/Annotations/val2014' ImageDir = './coco_class_6/images/ ...
- 谈谈C#中各种线程的使用及注意项~
说到线程,很多人会想到timer吧, 接下来我们就来学习一下 timer 吧,摇摇脑袋,清醒一下,接下来开始学习.... 一.基本概念 1.什么是进程? 当一个程序开始运行时,它就是一个 ...
- 2.Scrapy基本命令介绍
1.安装scrapy框架 a.安装wheel pip install wheel -i https://pypi.douban.com/simple/ b.安装twisted pip install ...
- 【Java】手把手理解CAS实现原理
先来看看概念,[CAS] 全称“CompareAndSwap”,中文翻译即“比较并替换”. 定义:CAS操作包含三个操作数 —— 内存位置(V),期望值(A),和新值(B). 如果内存位置的值与期望值 ...
- 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?
写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...
- 如何使用JPA的@Formula注解?
背景描述 我们经常会在项目中用到一些数据字典,在存储和传输时使用Code,在前端展示时使用Name,这样做的好处是便于系统维护,比如项目中用到了"医院"这个名称,如果后期需求发生变 ...
- Java——参数传递
写这篇文章时,其实还是不理解Java中的参数传递只有传值没有传址(传引用).这里引用知乎上大神的讲解来记录一下. 一.基本类型和引用类型 int num = 10; String str = &quo ...
- [Android应用开发] 02.界面展现和文件权限
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- [PHP自动化-进阶]005.Snoopy采集框架介绍
引言:Snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务. **官方网址:http://snoopy.sourceforge.net/** 简单一句话表达:& ...
- ftp上传html文件
在用ftp上传当个html文件时,发现html文件会被压缩成一行,在html中的单行注释将后面的代码都注释掉了,导致网页不能正常访问. 8uftp.FlashFXP.filezilla 在这三个ftp ...