Python从入门到放弃(5)-常用扩展包

Posted by 高庆东 on November 7, 2019

pandas

pandas中read_csv()有几十个参数每个参数都有几个意义其中pandas中read_csv()中有个
参数chunksize=100 该参数表示生成一个大小为100的n块原文件切分的迭代器

去重

pandas中的去重是unique和set相似返回不重复的元素同时按大小排列 numpy中也有

import pandas as pd
a=[[11,22,33],[44,55,66]]
df=pd.DataFrame(a,columns=['a','b','c'])
df.a.unique()  去掉某列的重复 

numpy

作为python最重要的计算工具没有之一,其中常用方法需要都己住。还有一些高级的方法和技巧也需要记住先列一下常用的方法 。

去重 unique()

import numpy as np
a=np.array([1,2,3,1,2])
a.unique()#返回无重复数据这事错误的
#应该是
np.unique(a)#注意numpy对象没有unique方法

np.where()

条件判断,需要考虑结果输出维度

a=[[1,0,0,],[0,1,0],[0,1,0],[0,0,1] ]
import numpy as np
np.where(a)[0]#给出不为0的位置的维度`[0]`表示第一个维度上不为0的项

排序

主要的方法有max 取最大值,可以指定在某个维度上 min取最小值,argmax取最大值所在的位置,可以指定某个维度
argmin取最小值所在位置.argsort返回元素从小到大排序在原序列的位置索引.
nonzero(a)返回a矩阵中不为0元素的坐标,又几个维度就返回几个数组

切分打乱数据

import numpy as np
a=np.array([1,2,3,4,5,6,7])
b=np.random.permutation(a)  #打乱数据
np.array_split(b,3)  #切分数据
a=np.array([[1,2,3],[3,4,5]])
b=np.random.permutation(a)#对于矩阵的打乱只是从行入手打乱每一行。行内数据不打乱
print(b)
np.array_split(b,2) #切分也是按行切分,行内不切分

构造数据

import numpy as np
a=np.zeros((10,3))  #构建0矩阵,需要加括号
a=np.identity(2)    #构造一个2维的单位阵
a=np.random.rand(2,3)#创建随机2*3矩阵

import numpy as np
a=np.array([[1,2],[3,4]])
a.repeat(4,1)  #表示在1维度上扩大4倍
#结果array([[1, 1, 1, 1, 2, 2, 2, 2],
       [3, 3, 3, 3, 4, 4, 4, 4]])

广播机制

广播说的就是矩阵形状在数学上不符合计算规则,但是某些情况下在numpy中可以计算的.

#a可以通过b来进行扩展
a=np.array([[6,7],[8,9]])
b=np.array([1,1,0,1,1,1,0,1,0,1,0,1])
a[b,0]
#可以利用这个图形计算不规则矩阵实现批量计算
a=numpy.random.rand(2,3)
b=numpy.random.rand(1.3)
a+b=a[0]+b,a[1]+b

当我们获取矩阵数据时以定要注意一个细节

a=np.random.rand(3,4)
c=a[:,0:2]
#此时c是2维矩阵
c=a[:,1]
#此时c只是一个向量

矩阵计算

主要说乘法,有些可以使用广播的方式进行 计算有些不能 numpy类型的矩阵可以对标量进行加减乘除

a=np.array([[1,2],[3,4]])
b=np.array([[1,2],[3,4]])
np.matmul(a,b)# 矩阵乘法  
np.dot(a,b)  #矩阵乘法
np.multiply(a,b) #对应位置相乘
a*b  #对应位置相乘

矩阵在内存上的连续性

我们需要明确一下C连续和F连续所谓C连续就是矩阵每一行数据存在一起,F连续时矩阵每一列
存在一起,实际上在内存中内存是一维的存储也是一维在c,或者python或者c++中是按行展成
一列,所以python行操作会比列操作快许多

import numpy as np
import time
a=np.ones((100,100))
t1=time.time()
sum(a,0)
t2=time.time()
print(t2-t1)

t1=time.time()
sum(a,1)
t2=time.time()
print(t2-t1)
#结果:0.00014400482177734375
       #0.000110626220703125

经过一些切片操作或者变形转换会使得数据在内从中不连续,我们可以使用
np.ascontiguousarray(array)将数据连续化

a=np.ones((100,100))
print(a.flags)
b=a[10:20,40:50]
print(b.flags)
c=np.ascontiguousarray(b)
print(c.flags)
#我们可以观察C连续性

矩阵变化

合并两个矩阵,有横向合并有纵向合并.

#在横向上合并矩阵
a=np.array([[1,2],[3,4]])
b=np.array([[5,6],[7,8]])
np.vstack((a,b))

#在纵向上合并矩阵
np.hstack([a,b])

矩阵维度变化

numpy中的ravel()、flatten()、squeeze()都有将多维数组转换为一维数组的功能,区别:
ravel():如果没有必要,不会产生源数据的副本 数以更快
flatten():返回源数据的副本
squeeze():只能对维数为1的维度降维
另外,reshape(-1)也可以“拉平”多维数组
其中resiez会对数据本身造成变化,而reshape会生成副本

a=np.ones((3,4))
a.ravel()#将数据铺平为1维不会生成副本只是对原数据进行操作
a.flatten()#将数据铺平维1维,会生成副本,这在内存考虑的时候可以用到
#a.squeeze()去掉数据的一个维度这个维度上只有一个数据

#在函数中切片的操作可能会让数据维度降低
import numpy as np
a=np.random.rand(4,5)  
a[1,2:4].shape   #最后只有维度2这个数了  第一个维度选择为1,这个维度上只有一个会降低维度
#结果:2

合并连接矩阵

a=np.array([[1,2],[3,4]])
b=np.array([[5,66],[7,8]])
np.concatenate([a,b],axis=1)  在维度1上拼接 

字符串生成数字

import numpy as np
np.fromstring("4-3-2", dtype=int, sep="-")

保存数据np.savez_compressed()

import numpy as np
a=np.random.rand(10,10)
b=np.random.randint(0,10,(10,10))
np.savez_compressed('./np_save',a=a,b=a)#字典形式保存 后缀是固定的npz
x=np.load('./np_save.npz')
x['a'] #以字典形式访问

使用这个函数保存的数据以字典的形式存在硬盘上读取的时候也是以字典的方式读取
这种方式保存的数据内存占用最小
还有其他的np.save(),np.savez(),np.savetxt

sklearn

计算auc

from sklearn import  metrics
a=[1,1,1,1,1,1,1,1,1] #预测值
b=[1,1,1,1,1,1,1,1,0] #实际值
metrics.roc_auc_score(b,a)