python.numpy学习

想要用python写一些算法,发现得用到numpy,大致跟matlab差不多,花了半天时间,看了《利用python进行数据分析》(《python for data analysis》)中的第四章,整理了一下,贴出来分享给大家。

注意:有些图中的代码是我自己做的,有些是书中截图的。我做的,我直接from numpy import *,所以直接打函数名就可以了;书中应该是import numpy as np,所以每个函数都是np.函数。


第四章 Numpy基础:数组和矢量计算

1 numpy的ndarray:一种多维数组对象
多维数组ndarray


每个数组都有一个shape:注意是a.shape,不是a.shape()

有一个dtype,说明数据类型

创建ndarray
1 array(data)

维度:b.ndim

2 zeros() ones() empty():创建一个没有具体值的数组

注意:empty()返回的不是0值,是未初始化的垃圾值

3 arange()


ndarry的数据类型:dtype

a.astype(''):转类型

数组和标量之间的运算
数组相当于矢量化(vectorization),不用编写循环即可对数据执行批量运算。
1 大小相等的数组之间的任何运算都会将运算应用到元素级。
+-*/ 两个数组维度相同,应用到元素级:

2 数组与标量的运算也会传播到各个元素

3. 不同大小的数组之间的运算叫做广播(broadcasting),不做介绍。
基本的索引和切片

arr[5:8]=12,会将12赋值给arr[5],arr[6],arr[7];
注意:数组切片是原始数组的视图,即视图上的任何修改都会直接反映到源数组上!
如果想要得到一个副本,需要显示的进行复制操作: arr[5:8].copy()

对于二维数组:


a[2,3]和a[2][3]是等价的。

切片索引

一个轴一个轴的切,中间用","分隔;冒号":"表示选取整个轴

布尔型索引

上面这个布尔型数组可以用于数组索引,将值为"True"的索引处数据取出来:


注意:布尔型数组的长度必须跟被索引的轴长度一致,比如这里布尔型数组长度为4,data第一轴的长度也为4

还可以使用不等于(!=),也可以使用负号(-)对条件进行否定:

可以使用&(和),|(或)之类的布尔运算符号:

常用手段:
将data中所有负值设置为0:data[data<0]=0
设置整行或整列的值:data[names!='a']=5

花式索引(Fancy indexing)
为了以特定顺序选取子集,只需传入一个用于指定顺序的正数列表或narray即可。
选出了a[4]a[7]a[1],并按数组顺序排列

如果整数数组是负数,则从末尾开始选:
同Python索引一样,正数从索引0开始,负数从-1开始,所以-1对应的是最后一行


一次传入多个索引,返回的是一个一维数组:

数组转置和轴对换
T属性(矩阵转置):也可以直接transpose(a)

对于高维数组,利用transpose(),需要得到一个有轴编号组成的元祖(没看懂怎么转的,感觉用不到):

注意:返回的是视图,改动视图会改动原数据

2 通用函数:快速的元素级数组函数
通用函数是对narray中的数据执行元素级运算的函数。
一元通用函数:

接上

二元通用函数,也可直接使用+-*/<>==!=

3 利用数组进行数据处理
用数组表达式代替循环的做法,被称为矢量化。相当于对数据进行批量处理,不用循环。

meshigrid(a,a)构造了一个网格,对应的(x,y)为网格上的点。

numpy.where()函数

where(condition, a, b) condition成立,置为a,否则置为b
数学和统计方法
mean(), sum()

mean()和sum()函数可以接受一个axis参数,用于计算该轴向上的统计值

a.sum(0)统计0轴(行)上的统计值,其实统计的是每列的和
a.sum(1)统计1轴(列)上的统计值,统计每行的和


在上面这些方法中,布尔值会强制转换为1(true)和(false)。
比如用sum统计>0的数:

排序sort()

多维数组可以在任何一个轴向上进行排序,只需将轴编号传给sort即可:

唯一化(unique)及其他逻辑集合
unique():返回数组中唯一值并返回已排序的结果:


4 文件输入输出
将数组以二进制格式保存到磁盘save(), load()
save()和load()函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中。

文件会自动加上.npy扩展名,然后就可以通过load()读取数据:

存取文本文件savetxt(), loadtxt()
如读取一个逗号分隔的txt文件:
保存则是np.savetxt('test.txt', arr)
5 线性代数(矩阵乘法,矩阵分解,行列式等操作)
矩阵乘法dot()
numpy.linalg中有一租标准的矩阵分解运算以及求逆等函数。



注意:
如果只是from numpy import *,不能直接使用inv等函数,需要linalg.inv()才能使用,或者把linalg import 进来:

6 随机数生成(random包)
numpy.random模块对python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值函数。

normal(size=(3,3)):得到一个标准正态分布3*3样本数据



没搞懂他俩有啥区别。。感觉randn和normal不是同一回事吗?







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值