Python---numpy的初步认识
什么是numpy?
NumPy是Python科学计算的基础包。 (它提供了多维数组对象、基于数组的各种派生对象(例如,masked Array, 矩阵)。除此之外,还提供了各种各样的加快数组操作的例程,包括数学基本计算、逻辑、图形操作、排序、选择、输入输出,离散傅立叶变换、基础线性代数、基础统计操作、随机仿真等等。)
NumPy的核心是ndarray对象。一方面,Ndarray对象封装了可以包含相同数据类型的多维数组;另一方面,为获得更好的性能, 在ndarray上的操作都是在编译过的代码上执行的。此外,和Python自身的序列对象相比,两者之间有如下不同:
NumPy数组的大小是固定的。Python的List是可以动态增长的。改变NumPy的大小会重新创建一个新的数组并把原来的删掉。NumPy数组中的元素一定是同一类型的。(相应地,每个元素所占的内存大小也是一样的。)例外情况是:(不是特别理解:one can have arrays of (Python, including NumPy) objects, thereby allowing for arrays of different sized elements.)NumPy数组支持在大量数据上进行数学计算和其他类型的操作。通常情况下,与Python自带的序列类型相比,NumPy数组上的操作执行更高效,代码量也更少。越来越多的Python科学计算包都是用到了NumPy的数组;虽然这些库支持Python序列类型的输入,但是内部操作还是要先将其转换为NumPy的数组类型,而且输出通常就是NumPy数组。所以,如果你想要高效地使用这些Python的科学计算包,仅仅知道Python内建的序列类型是不够的,你还需要知道如何使用NumPy数组。
numpy怎么使用?
导入使用包:import numpy as np创建ndarray. 直接创建:
arr = np.array([1,3,4,5])
arr = np.array([
[1,2,3,4],
[5,6,7,8]
])
**通过函数方式创建**:参考下文的函数使用
numpy的常用函数有哪些?
ndarray(数组)基础属性函数(axis=0表述列, axis=1表述行) .ndim:数组的维度值 .shape:数组的维度的尺度(简单说就是数组的形状)。例如:(2,3,5) .size:数组中所有元素的个数总和(一共都有多少个元素) .dtype:数组中元素的类型(每个数组里面的类型是一样的)。例如:int32 .itemsize:数组中每个元素的大小(以字节为单为,每个元素占4个字节)ndarray(数组)的创建 注意:函数的相关参数,可以参考pycharm中函数参数的说明 np.array(list):将列表转换为ndarray np.arange(n):创建多少到多少,步幅为多少的随机值的ndarray。 np.ones(shape):生成一个指定形状的,值全为1的ndarray。(shape是一个形状定义的元组:(3,2),下面的函数中shape都是这样的) np.zeros(shape):生成一个指定形状的,值全为0的ndarray。 np.empty(shap):生成一个指定形状的数组,值为一些无效的垃圾数据 np.full(shape,val):生成一个指定形状,指定值的ndarray。 np.eye(n):生成行数等于列数的对角矩阵 np.ones_like(a):按数组a的形状生成全1的数组 np.zeros_like(a): 同理 np.full_like (a, val) : 同理 np.linspace(1,10,4, endpoint = False): 根据起止数据等间距地生成数组 ,endpoint 表示10是否作为生成的元素(等差数组) np.logspace(0,9,10):等比数组 np.concatenate((ndarray1,ndarray2),axis=0):将两个ndarray组合起来
注意:linspace 和 logspace默认都是闭合区间取值,第三个参数是元素个数 arange是前闭后开取值,第三个参数是步长
数组的维度的转换 arr.shape = (x,y) 强制转换形状,改变原数组 arr.reshape(shape):不改变当前数组,按shape生成一个新的形状数组(与原数组共享内存)返回 np.swapaxes(arr,ax1,ax2):件两个维度进行调换 arr.flatten():对数据进行降维,返回折叠后的-维数组 arr.reshape(-1):也是降维 注意:维度转换简单理解就是数组中每个元素都有定位的x,y,z标识,维度转换,就是类似:y,x,z形式生成一个新的x,y,z数组 降维可以理解为,从左到右,按照每行的执行顺序将数据依次放入新的数组中数组的类型转变 数据类型的转换:arr.dtype=np.float32 指定当前数组的数据类型 arr2 = arr.astype(float) ,根据当前数组,创建一个指定类型的新数组 数组向列表的转换:a.tolist()数组的索引和切片 一维数组切片 a = np.array([9,8,7,6,5,4]) a[1:4:2]==>array([8,6]) [起始编号:终止编号(不含):步长] 多维数组切片
arr = np.arange(12).reshape((3, 4))
arr[i, :] #取第i行数据
arr[i:j, :] #取第i行到第j行的数据
arr[:,0] # 取第0列的数据,以行的形式返回的
arr[:,:1] # 取第0列的数据,以列的形式返回的
# 取第一维的索引1到索引2之间的元素,也就是第二行
# 取第二维的索引1到索引3之间的元素,也就是第二列和第三列
arr[1:2, 1:3]
# 取第一维的全部
# 按步长为2取第二维的索引0到末尾之间的元素,也就是第一列和第三列
arr[:, ::2]
简单的理解就是逗号(,)是维区隔符,多个逗号就多了一个维,冒号(:)是切片方式,一组最多两个冒号(开始:结束(不包含):步长) 例如一个3维的数组要切片 arr[开始:结束(不包含):步长 , 开始:结束(不包含):步长, 开始:结束(不包含):步长 ] 最后一维的切片没冒号,就是行显示,有冒号就是列显示了
普通索引数组 布尔索引数组: names = np.array([u’张三’,u’张四’,u’张五’]) scores = np.array([ [85,86,87,88], [95,96,97,98], [55,56,57,58] ]) classs = np.array([u’语文’,u’数学’,u’物理’,u’化学’]) scores[names == u’张四’].reshape(-1)[classs == u’物理’][0]
花式索引数组:arr[np.ix_([0,3,5],[0,3,2])]
数组的运算 函数形式运算 一元函数 np.abs(a) np.fabs(a) : 取各元素的绝对值 np.sqrt(a) : 计算各元素的平方根 np.square(a): 计算各元素的平方 np.log(a) np.log10(a) np.log2(a) : 计算各元素的自然对数、10、2为底的对数 np.ceil(a) np.floor(a) : 计算各元素的ceiling 值, floor值(ceiling向上取整,floor向下取整) np.rint(a) : 各元素 四舍五入 np.modf(a) : 将数组各元素的小数和整数部分以两个独立数组形式返回 np.exp(a) : 计算各元素的指数值 np.sign(a) : 计算各元素的符号值 1(+),0,-1(-) np.modf(a):将数组中元素的小数为和整数位以两部分独立数组的形式返回 np.isnan(a):返回一个表示“哪些值是NaN(不是一个数字)”的布尔类型数组 np.isfinite(a), np.isinf(a) : 分别表示“哪些元素是有穷的(非inf,非NaN)”或者“哪些元素是无穷的“的布尔类型数组 np.cos(arr),np.cosh(arr) np.sin(arr), np.sinh(arr) np.tan(arr),np.tanh(arr) 普通以及双曲型三角函数 np.arccos(arr), np.arccosh(arr) np.arcsin(arr), np.arcsinh(arr) np.arctan(arr), np.arctanh(arr) 反三角函数
二元函数 np.mod(arr1,arr2) 元素级的取模 np.dot(arr1,arr2) 求两个数组的点积(矩阵积) np.greater(arr1,arr2): (arr1 >arr2) np.less(arr1,arr2) : (arr1 < arr2) np.equal(arr1,arr2): (arr1 == arr2) np.less_equal(arr1, arr2):(arr1 <= arr2) np.greater_equal(arr1,arr2):(arr1
arr = np.array([
[1,2,np.NaN,4],
[4,5,6,np.NaN],
[7,8,9,np.inf],
[np.inf,np.e,np.pi,4]
])
condition = np.isnan(arr) | np.isinf(arr)
print(np.where(condition, 0, arr))
# 满足条件的值用第二个参数替换
**数据的去重(去重重复值)**
“` arr2 = np.unique(arr) #返回由单一值构成的从小到大的一维数组
自己的矢量运算 a+b a-b a*b a/b a%b a//b b可也是数字,也可以是nbarray(但是必须和a一样的形状)
/************************* 华丽的分割线 **********************************/
数据的CSV文件存取 CSV (Comma-Separated Value,逗号分隔值) 只能存储一维和二维数组
np.savetxt(frame, array, fmt=’% .18e’, delimiter = None): frame是文件、字符串等,可以是.gz .bz2的压缩文件; array 表示存入的数组; fmt 表示元素的格式 eg: %d % .2f % .18e ; delimiter: 分割字符串,默认是空格 eg: np.savetxt(‘a.csv’, a, fmt=%d, delimiter = ‘,’ )
np.loadtxt(frame, dtype=np.float, delimiter = None, unpack = False) : frame是文件、字符串等,可以是.gz .bz2的压缩文件; dtype:数据类型,读取的数据以此类型存储; delimiter: 分割字符串,默认是空格; unpack: 如果为True, 读入属性将分别写入不同变量。 多维数据的存取 a.tofile(frame, sep=’’, format=’%s’ ) : frame: 文件、字符串; sep: 数据分割字符串,如果是空串,写入文件为二进制 ; format:: 写入数据的格式 eg: a = np.arange(100).reshape(5, 10, 2) a.tofile(“b.dat”, sep=”,”, format=’%d’)
np.fromfile(frame, dtype = float, count=-1, sep=’’): frame: 文件、字符串 ; dtype: 读取的数据以此类型存储; count:读入元素个数, -1表示读入整个文件; sep: 数据分割字符串,如果是空串,写入文件为二进制
PS: a.tofile() 和np.fromfile()要配合使用,要知道数据的类型和维度。
np.save(frame, array) : frame: 文件名,以.npy为扩展名,压缩扩展名为.npz ; array为数组变量 np.load(fname) : frame: 文件名,以.npy为扩展名,压缩扩展名为
np.save() 和np.load() 使用时,不用自己考虑数据类型和维度。
numpy随机数函数 numpy 的random子库
rand(d0, d1, …,dn) : 各元素是[0, 1)的浮点数,服从均匀分布 randn(d0, d1, …,dn):标准正态分布 randint(low, high,( shape)): 依shape创建随机整数或整数数组,范围是[ low, high) seed(s) : 随机数种子
shuffle(a) : 根据数组a的第一轴进行随机排列,改变数组a permutation(a) : 根据数组a的第一轴进行随机排列, 但是不改变原数组,将生成新数组 choice(a[, size, replace, p]) : 从一维数组a中以概率p抽取元素, 形成size形状新数组,replace表示是否可以重用元素,默认为False。 eg: replace = False时,选取过的元素将不会再选取
uniform(low, high, size) : 产生均匀分布的数组,起始值为low,high为结束值,size为形状 normal(loc, scale, size) : 产生正态分布的数组, loc为均值,scale为标准差,size为形状 poisson(lam, size) : 产生泊松分布的数组, lam随机事件发生概率,size为形状 eg: a = np.random.uniform(0, 10, (3, 4)) a = np.random.normal(10, 5, (3, 4))
numpy的统计函数 sum(a, axis = None) : 依给定轴axis计算数组a相关元素之和,axis为整数或者元组 mean(a, axis = None) : 同理,计算平均值 average(a, axis =None, weights=None) : 依给定轴axis计算数组a相关元素的加权平均值 std(a, axis = None) :同理,计算标准差 var(a, axis = None): 计算方差 eg: np.mean(a, axis =1) : 对数组a的第二维度的数据进行求平均 a = np.arange(15).reshape(3, 5) np.average(a, axis =0, weights =[10, 5, 1]) : 对a第一各维度加权求平均,weights中为权重,注意要和a的第一维匹配
min(a) max(a) : 计算数组a的最小值和最大值 argmin(a) argmax(a) : 计算数组a的最小、最大值的下标(注:是一维的下标) unravel_index(index, shape) : 根据shape将一维下标index转成多维下标 ptp(a) : 计算数组a最大值和最小值的差 median(a) : 计算数组a中元素的中位数(中值) eg:a = [[15, 14, 13], [12, 11, 10] ] np.argmax(a) –> 0 np.unravel_index( np.argmax(a), a.shape) –> (0,0)
numpy的梯度函数 np.gradient(a) : 计算数组a中元素的梯度,f为多维时,返回每个维度的梯度 离散梯度: xy坐标轴连续三个x轴坐标对应的y轴值:a, b, c 其中b的梯度是(c-a)/2 而c的梯度是: (c-b)/1
当为二维数组时,np.gradient(a) 得出两个数组,第一个数组对应最外层维度的梯度,第二个数组对应第二层维度的梯度。
图像的表示和变换 PIL, python image library 库 from PIL import Image Image是PIL库中代表一个图像的类(对象)
im = np.array(Image.open(“.jpg”))
im = Image.fromarray(b.astype(‘uint8’)) # 生成 im.save(“路径.jpg”) # 保存
im = np.array(Image.open(“.jpg”).convert(‘L’)) # convert(‘L’)表示转为灰度图
PS:本博文摘抄自中国慕课大学上的课程《Python数据分析与展示》,推荐刚入门的同学去学习,这是非常好的入门视频。
本文系转载, 前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系 转载 , 前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。