目录##

掌握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###

vstackhstack的融合版本,通过指定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->vsplithstack->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(四)的更多相关文章

  1. numpy(四)

    逻辑符 : ==  !=  <  > <=  >= x=np.array([1,3,5]) x<3 array([True,False,,False]) (2*x) == ...

  2. 掌握numpy(一)

    NumPy是一款用于科学计算的python包,强大之处在于矩阵的运算以及包含丰富的线性代数运算的支持.本文将对numpy一些常用的用法进行讲解,一来是对自己的知识进行梳理,二来作为一份备忘录供以后查阅 ...

  3. 掌握numpy(三)

    统计功能 前面都是介绍numpy的一些特性,被称为数学运算神器怎么能少了统计功能呢 ndarray的方法 a = np.array([[-2.5, 3.1, 7], [10, 11, 12]]) &g ...

  4. 掌握numpy(二)

    目录 掌握numpy(一) 掌握numpy(二) 掌握numpy(三) 掌握numpy(四) 数组的reshape 顾名思义,就是对数组的形状进行改变,比如行变成列,一行变多行等. in place ...

  5. Theano3.2-练习之数据集及目标函数介绍

    来自http://deeplearning.net/tutorial/gettingstarted.html#gettingstarted 一.下载 在后续的每个学习算法上,都需要下载对应的文档,如果 ...

  6. anconda使用---使用conda管理python环境

    一.动机 最近打算折腾vn.py,但只有py27版本的,因为一向习惯使用最新稳定版的,所以不得不装py27的环境,不得不说 Python的全局锁真的很烦. 身为懒癌患者,必然使用全功能的anacond ...

  7. python 包管理工具 pip 的配置

    近几年来,python的包管理系统pip 越来越完善, 尤其是对于 windows场景下,pip大大改善了python的易用性. https://www.cnblogs.com/yvivid/p/pi ...

  8. 使用conda管理python环境

    一.动机 最近打算折腾vn.py,但只有py27版本的,因为一向习惯使用最新稳定版的,所以不得不装py27的环境,不得不说 Python的全局锁真的很烦. 身为懒癌患者,必然使用全功能的anacond ...

  9. PyTorch基础——使用卷积神经网络识别手写数字

    一.介绍 实验内容 内容包括用 PyTorch 来实现一个卷积神经网络,从而实现手写数字识别任务. 除此之外,还对卷积神经网络的卷积核.特征图等进行了分析,引出了过滤器的概念,并简单示了卷积神经网络的 ...

随机推荐

  1. HDU1068 二分匹配 独立集

    前边和后边性别不同!!!不然NP了 Girls and Boys Problem Description the second year of the university somebody star ...

  2. 强大的grep,sed和awk--用案例来讲解

    准备工作: 先简单了解grep,sed和awk功能 1) grep 显示匹配特定模式的内容 grep -v 'boy' test.txt 过滤掉test.txt文件的boy,显示其余内容 grep ' ...

  3. style里的文字 背景 样式以及边框

    <style>        body{background:#FCC;}        .c00 div{ margin:0 auto; padding:0;}        #a01{ ...

  4. 如何用IDEA一步一步开发WebService服务器端

    工具:IntelliJ IDEA 15.0.4 IDEA这款IDE还是非常强大的,对WebService也有很好的支持.下面我们来一步一步的实现WebService服务器端: 第一步,新建一个工程:F ...

  5. hdu 4751 Divide Groups bfs (2013 ACM/ICPC Asia Regional Nanjing Online 1004)

    SDUST的训练赛 当时死磕这个水题3个小时,也无心去搞其他的 按照题意,转换成无向图,预处理去掉单向的边,然后判断剩下的图能否构成两个无向完全图(ps一个完全图也行或是一个完全图+一个孤点) 代码是 ...

  6. 自学 Python 3 最好的 入门 书籍 推荐(附 免费 在线阅读 下载链接)

    请大家根据自己的实际情况对号入座,挑选适合自己的 Python 入门书籍: 完全没有任何编程基础:01 号书 少量编程基础,不求全,只希望能以最快的速度入门:02 号书 少量编程基础,有一定的英文阅读 ...

  7. Python线程的常见的lock

    IO阻塞分析: 下面该需求很简单将一个数值100做自减处到0.主函数中有0.1秒的IO阻塞 import threading import time def sub(): global num # 掌 ...

  8. LeetCode 485. Max Consecutive Ones (最长连续1)

    Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1, ...

  9. LeetCode 101. Symmetric Tree (对称树)

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  10. OpenCV4Android背景建模(MOG、MOG2)

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃     很久以前的笔记了,分享给大家吧...OpenCV4Android中用于背景建模的类主要 ...