Numpy简单介绍
1.Numpy是什么
很简单,Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用。其实,list已经提供了类似于矩阵的表示形式,不过numpy为我们提供了更多的函数。如果接触过matlab、scilab,那么numpy很好入手。 在以下的代码示例中,总是先导入了numpy:(通用做法import numpu as np 简单输入)
1 2 3 |
|
2. 多维数组
多维数组的类型是:numpy.ndarray。
使用numpy.array方法
以list或tuple变量为参数产生一维数组:
1 2 3 4 5 6 |
|
以list或tuple变量为元素产生二维数组或者多维数组:
1 2 3 4 5 6 7 8 |
|
numpy数据类型设定与转换
numpy ndarray数据类型可以通过参数dtype 设定,而且可以使用astype转换类型,在处理文件时候这个会很实用,注意astype 调用会返回一个新的数组,也就是原始数据的一份拷贝。
1 2 3 4 5 6 7 8 |
|
numpy索引与切片
index 和slicing :第一数值类似数组横坐标,第二个为纵坐标
1 2 3 4 5 |
|
涉及改变相关问题,我们改变上面y是否会改变x?这是特别需要关注的!
1 2 3 4 5 6 7 8 |
|
通过上面可以发现改变y会改变x ,因而我们可以推断,y和x指向是同一块内存空间值,系统没有为y 新开辟空间把x值赋值过去。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
如上所示:当将一个标量赋值给切片时,该值会自动传播整个切片区域,这个跟列表最重要本质区别,数组切片是原始数组的视图,视图上任何修改直接反映到源数据上面。
思考为什么这么设计? Numpy 设计是为了处理大数据,如果切片采用数据复制话会产生极大的性能和内存消耗问题。
假如说需要对数组是一份副本而不是视图可以如下操作:
1 2 3 4 5 6 |
|
再看下对list 切片修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
这里设计到python 中深浅拷贝,其中切片属于浅拷贝
多维数组索引、切片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
布尔型索引
这种类型在实际代码中出现比较多,关注下。
1 2 3 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
上面展示通过布尔值来设置值的手段。
数组文件输入输出
在跑实验时经常需要用到读取文件中的数据,其实在numpy中已经有成熟函数封装好了可以使用
将数组以二进制形式格式保存到磁盘,np.save 、np.load 函数是读写磁盘的两个主要函数,默认情况下,数组以未压缩的原始二进制格式保存在扩展名为.npy的文件中
1 2 3 4 |
|
存取文本文件:
文本中存放是聚类需要数据,直接可以方便读取到numpy array中,省去一行行读文件繁琐。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
np.savetxt 执行相反的操作,这两个函数在跑实验加载数据时可以提供很多便利!!!
使用numpy.arange方法
1 2 3 4 5 6 7 8 9 10 |
|
使用numpy.linspace方法
例如,在从1到10中产生20个数:
1 2 3 4 5 |
|
使用numpy.zeros,numpy.ones,numpy.eye等方法可以构造特定的矩阵
1 2 3 4 5 6 7 8 9 10 11 12 |
|
获取数组的属性
1 2 3 4 5 6 7 8 9 10 11 |
|
合并数组
使用numpy下的vstack(垂直方向)和hstack(水平方向)函数:
1 2 3 4 5 6 7 8 9 10 |
|
看一下这两个函数有没有涉及到浅拷贝这种问题:
1 2 3 4 5 6 7 8 9 |
|
通过上面可以知道,这里进行是深拷贝,而不是引用指向同一位置的浅拷贝。
深拷贝数组
数组对象自带了浅拷贝和深拷贝的方法,但是一般用深拷贝多一些:
1 2 3 4 5 6 7 |
|
基本的矩阵运算
转置:
1 2 3 4 5 6 7 |
|
numpy.linalg模块中有很多关于矩阵运算的方法:
特征值、特征向量:
1 2 3 4 |
|