掌握numpy(四)
目录##
掌握numpy(一)
掌握numpy(二)
掌握numpy(三)
掌握numpy(四)
数组的累加(拼接)##
在前面讲了使用切片方法能够对数组进行切分,使用copy对切片的数组进行复制,那么数组该如何拼接呢?
a1 = np.full((2,3),1)#填充数组
a2 = np.full((3,3),2)
a3 = np.full((2,3),3)
>>a3
array([[ 3., 3., 3.],
[ 3., 3., 3.]])
vstack###
竖直方向拼接数组
a4 = np.vstack((a1,a2,a3)) #a1,a2,a3必须有相同的列数
>> a4
[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 2. 2. 2.]
...,
[ 2. 2. 2.]
[ 3. 3. 3.]
[ 3. 3. 3.]]
hstack###
使用hstack从水平方向拼接数组
try:
a5 = np.hstack((a1,a2))#行数不匹配
except ValueError as e:
>>print e
all the input array dimensions except for the concatenation axis must match exactly
a5 = np.hstack((a1,a3))#正确
>>a5
array([[ 1., 1., 1., 3., 3., 3.],
[ 1., 1., 1., 3., 3., 3.]])
concatenate###
是vstack和hstack的融合版本,通过指定axis进行选择拼接方向
a6 = np.concatenate((a1,a2),axis=0)#竖直方向
>>a6
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 2., 2., 2.],
[ 2., 2., 2.],
[ 2., 2., 2.]])
a7 = np.concatenate((a1,a3),axis=1)
>>a7
array([[ 1., 1., 1., 3., 3., 3.],
[ 1., 1., 1., 3., 3., 3.]])
stack###
上面介绍的三种方法都是按照某一维度进行拼接,stack方法拼接是引入了一个新的维度
a8=np.stack((a1,a3))
>>a8
array([[[ 1., 1., 1.],#a8[0]
[ 1., 1., 1.]],
[[ 3., 3., 3.],#a8[1]
[ 3., 3., 3.]]])
>>a8.shape
(2L, 2L, 3L)
数组的拆分(split)##
前面讲到了数组的拼接,相应的就是拆分。vstack->vsplit和hstack->hsplit
vsplit###
c = np.arange(24).reshape(4, 6)
c1,c2 = np.vsplit(c,2)
>>c1
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])
hsplit###
c3,c4 = np.hsplit(c,2)
>>c3
array([[ 0, 1, 2],
[ 6, 7, 8],
[12, 13, 14],
[18, 19, 20]])
线性代数##
Numpy的二维数组常用来表示线性代数中的矩阵,提供了一些便捷的矩阵操作方法,代数运算的方法主要是在 numpy.linalg模块中。
矩阵的转置###
矩阵的转置使用transpose或者T
m = np.arange(24).reshape(4, 6)
>>m
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>m.T
array([[ 0, 6, 12, 18],
[ 1, 7, 13, 19],
[ 2, 8, 14, 20],
[ 3, 9, 15, 21],
[ 4, 10, 16, 22],
[ 5, 11, 17, 23]])
上面的例子是矩阵的rank>=2的时候,如果rank=1的时候呢?
m1=np.arange(5)
>>m1
array([0, 1, 2, 3, 4])
>>m1.T
array([0, 1, 2, 3, 4]) #并为发生变化
可以看出T对于rank=1的数组是无效的。我们可以通过reshape将1D数组转化为2D.
m1r = m1.reshape(1,5)#array([[0, 1, 2, 3, 4]])
>>m1r.T
array([[0],
[1],
[2],
[3],
[4]])
矩阵的内积运算###
在做内积运算的时候,两个矩阵是有形状限制的,例如n1的形状为MxN,那么n2的形状必须为NxS
n1 = np.arange(10).reshape(2, 5)
n2 = np.arange(15).reshape(5,3)
>>n1.dot(n2)
array([[ 90, 100, 110],
[240, 275, 310]])
矩阵的逆(inverse)###
inv方法是用来计算方阵的逆矩阵
import numpy.linalg as linalg
m2 = np.array([[1,2,3],[5,7,11],[21,29,31]])
>>m2
array([[ 1, 2, 3],
[ 5, 7, 11],
[21, 29, 31]])
>>linalg.inv(m2)
array([[-2.31818182, 0.56818182, 0.02272727],
[ 1.72727273, -0.72727273, 0.09090909],
[-0.04545455, 0.29545455, -0.06818182]])
单位矩阵###
单位矩阵(identity matrix)是对角线上元素都为1的矩阵;原始矩阵与逆矩阵的内积为单位矩阵。
>>m2.dot(linalg.inv(m))
array([[ 1.00000000e+00, -1.11022302e-16, -6.93889390e-18],
[ -1.33226763e-15, 1.00000000e+00, -5.55111512e-17],
[ 2.88657986e-15, 0.00000000e+00, 1.00000000e+00]])
在前面我们讲到了使用ones来创建全为1的矩阵,numpy也提供了单位矩阵的方法eys,
>>np.eye(3)
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
矩阵的行列式###
>>linalg.det(m2)
43.999999999999993#浮点数误差
特征值和特征向量###
特征值(eigenvalues)和特征向量(eigenvectors)的求解在矩阵分解时常被用到。
value,vector = linalg.eig(m2)
>>value
array([ 42.26600592, -0.35798416, -2.90802176])
>>vector
array([[-0.08381182, -0.76283526, -0.18913107],
[-0.3075286 , 0.64133975, -0.6853186 ],
[-0.94784057, -0.08225377, 0.70325518]])
奇异矩阵分解###
奇异矩阵分解(Singular Value Decomposition)被广泛的应用在推荐系统和数据降维中。
m3=np.array([[1,0,0,0,2], [0,0,3,0,0], [0,0,0,0,0], [0,2,0,0,0]])
U, S_diag, V = linalg.svd(m3)
>>S_diag
array([ 3. , 2.23606798, 2. , 0. ])
svd将矩阵才分为三部分,svd方法获得的S_diag是特征向量,现在我们需要的是Σ矩阵,所以需要构建Σ矩阵。
S = np.zeros((4, 5))
S[np.diag_indices(4)] = S_diag
>>S # Σ
array([[ 3. , 0. , 0. , 0. , 0. ],
[ 0. , 2.23606798, 0. , 0. , 0. ],
[ 0. , 0. , 2. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ]])
U、S和V三者的内积能够还原出原始矩阵
>>U.dot(S).dot(V)
array([[ 1., 0., 0., 0., 2.],
[ 0., 0., 3., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 2., 0., 0., 0.]])
存储和加载##
Numpy被广泛应用到机器学习领域,将一些处理后的数据持久能够有助于以后的使用。Numpy能够方便的存储和加载二进制文件和文本格式文件。
二进制.npy格式###
创建一个随机数组并将其存储。
a = np.random.rand(2,3)
>>a
array([[ 0.37740913, 0.45913655, 0.87659924],
[ 0.24951215, 0.04142309, 0.57092372]])
np.save("my_array", a)
在本地就生成了my_array.npy文件,note:虽然文件名并没有加后缀,NUmpy生成的文件名会自动的添加.npy后缀。我们看一看文件内容
with open('my_array.npy','rb') as f: #需要添加.npy后缀
content = f.read()
>>content
'\x93NUMPY\x01\x00F\x00{\'descr\': \'<f8\', \'fortran_order\': False, \'shape\': (2L, 3L), } \n\xbb\xa99\xfe1\xab\xea?\xa4k\x04\x14\xdc"\xda?\xe8\x95\x92\xc5:\xc4\xd6?\x98]\xed\x97\x07\x9e\xed?\xff\x9e\x97\xee\xa2\x16\xed?\xec\xd5\xc7\x8e\x8b\xaa\xcd?'
正确的加载方式是使用load
a = np.load('my_array.npy')
文本格式###
上面是以二进制格式存储,还可以文本格式存储。
np.savetxt("my_array.csv", a)
上面的格式可以使用普通的文件读取方式读取,这里就不再赘述,下面说一下numpy的读取方式
a = np.loadtxt("my_array.csv", delimiter=",")
zipped 格式###
numpy还支持将多个ndarray持久化到同一个文件中
b = np.arange(24, dtype=np.uint8).reshape(2, 3, 4)
>>b
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]], dtype=uint8)
np.savez("my_arrays", my_a=a, my_b=b) #自动添加.npz后缀
同save,二进制格式读取读出来的为乱码,使用load方法
my_arrays = np.load("my_arrays.npz")
>>my_arrays
<numpy.lib.npyio.NpzFile at 0xb2e39e8>
>>my_arrays.keys()
['my_b', 'my_a']
>>my_arrays['my_a']#字典方式读取
array([[ 0.75760441, 0.91559205, 0.42412305],
[ 0.49412246, 0.60609836, 0.69437913]])
至此,掌握NumPy系列文章到此结束,想要了解更多请参考官方文档
掌握numpy(四)的更多相关文章
- numpy(四)
逻辑符 : == != < > <= >= x=np.array([1,3,5]) x<3 array([True,False,,False]) (2*x) == ...
- 掌握numpy(一)
NumPy是一款用于科学计算的python包,强大之处在于矩阵的运算以及包含丰富的线性代数运算的支持.本文将对numpy一些常用的用法进行讲解,一来是对自己的知识进行梳理,二来作为一份备忘录供以后查阅 ...
- 掌握numpy(三)
统计功能 前面都是介绍numpy的一些特性,被称为数学运算神器怎么能少了统计功能呢 ndarray的方法 a = np.array([[-2.5, 3.1, 7], [10, 11, 12]]) &g ...
- 掌握numpy(二)
目录 掌握numpy(一) 掌握numpy(二) 掌握numpy(三) 掌握numpy(四) 数组的reshape 顾名思义,就是对数组的形状进行改变,比如行变成列,一行变多行等. in place ...
- Theano3.2-练习之数据集及目标函数介绍
来自http://deeplearning.net/tutorial/gettingstarted.html#gettingstarted 一.下载 在后续的每个学习算法上,都需要下载对应的文档,如果 ...
- anconda使用---使用conda管理python环境
一.动机 最近打算折腾vn.py,但只有py27版本的,因为一向习惯使用最新稳定版的,所以不得不装py27的环境,不得不说 Python的全局锁真的很烦. 身为懒癌患者,必然使用全功能的anacond ...
- python 包管理工具 pip 的配置
近几年来,python的包管理系统pip 越来越完善, 尤其是对于 windows场景下,pip大大改善了python的易用性. https://www.cnblogs.com/yvivid/p/pi ...
- 使用conda管理python环境
一.动机 最近打算折腾vn.py,但只有py27版本的,因为一向习惯使用最新稳定版的,所以不得不装py27的环境,不得不说 Python的全局锁真的很烦. 身为懒癌患者,必然使用全功能的anacond ...
- PyTorch基础——使用卷积神经网络识别手写数字
一.介绍 实验内容 内容包括用 PyTorch 来实现一个卷积神经网络,从而实现手写数字识别任务. 除此之外,还对卷积神经网络的卷积核.特征图等进行了分析,引出了过滤器的概念,并简单示了卷积神经网络的 ...
随机推荐
- Sqlserver数据库 通过表触发器 实时通知应用程序
/* Sqlserver数据库开始相关服务 以下示例显示了如何查看 OLE Automation Procedures 的当前设置.0未启用 */ EXEC sp_configure 'show ad ...
- Java继承--覆盖
java中支持单继承.不直接支持多继承,但对C++中的多继承机制进行改良. 单继承:一个子类只能有一个直接父类. 多继承:一个子类可以有多个直接父类(java中不允许,进行改良).不直接支持,因为多个 ...
- canvas图表详解系列(4):动态散点图
本章建议学习时间4小时 学习方式:详细阅读,并手动实现相关代码(如果没有canvas基础,需要先学习前面的canvas基础笔记) 学习目标:此教程将教会大家如何使用canvas绘制各种图表,详细分解步 ...
- win10 uwp smms图床
本文,如何使用smms图床上传图片,用到win10 uwp post文件,因为我是渣渣,如果本文有错的,请和我说,在本文评论,或发给我邮箱lindexi_gd@163.com,请不要发不良言论 找到一 ...
- 简说chart2.4的应用,以及Uncaught ReferenceError : require is not defined的解决
51呢最近在学习chart.js,然后呢就照着中文的帮助文档来然后就一直出Uncaught ReferenceError : require is not defined的问题查了挺多才知道是帮助文档 ...
- python第五课——自定义线程池
内容概要: 1.low版线程池 2.绝版线程池 1.low版线程池 设计思路:运用队列queue 将线程类名放入队列中,执行一个就拿一个出来 import queue import threading ...
- 【前端】Require.js使用方法总结
一.为什么要使用require.js 首先一个页面如果在加载多个js文件的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长:其次,由于js文件之间存在依赖关系,因此必须严格保证加载 ...
- Mysql隐式类型转换原则
MySQL 的隐式类型转换原则: - 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换 ...
- java:利用静态字段和构造函数实现已建对象数查询
问题:使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数. 请写一个类,在任何时候都可以向它查询"你已经创建了多少个对象?". 程序设计思想: 利用静态变量指定一个计数 ...
- jerasure 2.0译文
原文地址: 本文译者水平有限,如发现问题请批评指正 Jerasure 2.0:为方便存储相关应用开发的一个基于C开发的纠删码库 版本2.0 James S.Plank Kevin M.Greenan ...