Numpy 简介

import numpy as np

Numpy是应用Python进行科学计算的基础库。它的功能包括多维数组、基本线性代数、基本统计计算、随机模拟等。Numpy的核心功能是ndarray 类,即多维数组。多维数组是线性代数中非常广泛的概念,如一维数组就是向量,二维数组是矩阵。在数组中,要求所有元素必须是同一类型,这是与列表与字典的区别之一一。针对数组,通过Numpy可以实现的基本操作包括数组的创建、数组切片、数组重组、数组运算等。

01

数组的创建

常见的创建数组的方法之一:转换Python的列表、元组等数据结构为数组类型。下面实例给出了创建数组的常用命令。

>>> import numpy as np  # 载入Numpy库简写为"np">>> arr1 = np.array([1,2,3,4,5,6])>>> arr1array([1, 2, 3, 4, 5, 6])>>> type(arr1) # 查看数据类型numpy.ndarray>>> arr1.shape  # 各个维度的数组长度(6,)>>> arr2 = np.array([[1,2,3],[4,5,6]])>>> arr2 array([[1, 2, 3],       [4, 5, 6]])>>> arr2.shape(2, 3)

另外,还可以利用Numpy的内置函数来直接创建数组。

>>> arr3 = np.arange(0,1,0.1)>>> arr3array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])# 创建一维长度为2,二维长度为3的元素全为0的数组>>> arr4 = np.zeros((2,3)) >>> arr4 array([[ 0.,  0.,  0.],       [ 0.,  0.,  0.]])# 创建一维长度为2,二维长度为3的元素全为1的二维数组>>> arr5 = np.ones((2,3)) >>> arr5array([[ 1.,  1.,  1.],       [ 1.,  1.,  1.]])# 创建一维长度为2,二维长度为3的二维空数组>>> arr6 = np.empty([2,3]) >>> arr6array([[ 1.,  1.,  1.],       [ 1.,  1.,  1.]]) # 从[0,1]区间的均匀分布随机抽取四个数>>> arr7 = np.random.rand(4)>>> arr7array([ 0.36570416,  0.83097711,  0.98761922,  0.87057992])# 生成一个标准正态分布的4*4样本值>>> arr8 = np.random.normal(size=(4,4)) >>> arr8array([[-0.15990639,  0.7088309 , -0.20267733,  2.14992874],       [ 0.05542048, -1.15103197,  0.21129526,  0.6212253 ],       [-1.31547565,  1.4401065 ,  0.6680733 , -0.60608497],       [-1.03471769,  0.55338916, -0.05869825,  0.61610795]])

注意这里的 np.arange() 可以指定步长为(0,1)为小数,而Python内置函数range无此功能。另外,np.random 中包括多种概率分布的随机样本,是数据分析辅助的重点工具之一。

02

数组的切片与索引

数组的截取与 list 相同,可以通过 [] 来指定每个维度的索引。

>>> import numpy as np>>> a = np.array([[1,2,3,4,5],[6,7,8,9,10]])>>> print(a)[[ 1  2  3  4  5] [ 6  7  8  9 10]]>>> print(a[0:1])  # 截取第一行[[1 2 3 4 5]]>>> print(a[1,2:5]) # 截取第二行,第三、四、五列[ 8  9 10]>>> print(a[1:]) # 截取第二行[[ 6  7  8  9 10]]

另外,在应用中经常需要返回满足给定条件的数组元素。为此,下面介绍一个按照条件索引的数组操作。

>>> b = a[a>6] # 截取矩阵中大于6的元素,范围是一维数组>>> print(b)[ 7  8  9 10]

03

数组重组

数组重组主要是指对原来数组进行修改,具体包括数组类型修改、数组维度修改与数组元素修改。

>>> # 数组元素的数据类型为字符串>>> num_str1 = np.array(['1.2','2.4','3.6'],dtype=np.string_)>>> # 利用astype转换为浮点型>>> num_str1.astype(float)array([ 1.2,  2.4,  3.6])>>> data = np.arange(6)>>> # 利用reshape 指定新数组各个维度>>> data = data.reshape(2,3)  >>> dataarray([[0, 1, 2],       [3, 4, 5]])>>> # data中小于3的元素用0代替,否则用1代替>>> np.where(data < 3,0,1) array([[0, 0, 0],       [1, 1, 1]])

这里 np.where(condition,x,y)函数是三元表达式:满足条件(condition),输出 x ,不满足输出 y 。

04

 数组运算

数学中的加减乘除运算同样也使用于数组。在数组中是按照元素级进行批量运算的,下面挑选几个实例来说明这一点:

>>> arr7 = np.array([[1,2,3],[4,5,6]])>>> arr7array([[1, 2, 3],       [4, 5, 6]])>>> arr7 * 2    # 数组的每个每个元素都乘以2array([[ 2,  4,  6],       [ 8, 10, 12]])>>> arr7*arr7   # 两个数组对应的元素进行运算array([[ 1,  4,  9],       [16, 25, 36]])>>> np.log(arr7)  # 数组的每个元素都取 logarray([[ 0.        ,  0.69314718,  1.09861229],       [ 1.38629436,  1.60943791,  1.79175947]])

除了上述简单的元素级运算,数组也可以进行各种矩阵运算,如矩阵向量的混合运算、矩阵求逆、矩阵行列式、矩阵特征值。

>>> A = np.array([[0,1],[2,3]])>>> Aarray([[0, 1],       [2, 3]])>>> v = np.array([1,2])>>> varray([1, 2])>>> v.dot(A)  # dot是内积运算,运算规则与线性代数相同array([4, 7])>>> A.dot(v)  # 这里v看作列变量array([2, 8])

Numpy 库为Python中的数组运算提供了很多便捷,这里只列举了常用的少数几个操作命令。其实,Numpy可以看作计算科学的基础模块,而接下来介绍的pandas库是在Numpy基础上的拓展,也具备Numpy中的许多功能,而且不要求数据类型必须单一。

pandas 简介

import pandas as pd

Pamdas是建立在 Numpy库之上的,是使得数据分析工作变得更简单更快的高级操作工具。pandas的进行数据处理主要针对两种数据结构:Series 和 DataFrame 。

Series

Series 是建立在 pandas 库之上的,是使得数据分析工作变得更简单更快的高级操作工具。引入索引的一大作用是数据对其功能,使得进行数据处理后不会发生数据错行。最简单的 Series 可以由一个列表类型的数据生成:

>>> import pandas as pd>>> ser1 = pd.Series([1,3,5,7])>>> ser10    11    32    53    7dtype: int64

Series的数据变现形式:索引在左侧,值在右边,默认的索引是从0开始的整数型序列。我们也可以在创建的时候通过 index 参数指定索引数据。

>>> ser2 = pd.Series([1,3,5,7], index=['a','b','c','d'])>>> ser2a    1b    3c    5d    7dtype: int64

在创建 Series 后可以对它们的一些属性进行修改,如下所示:

>>> ser2.indexIndex(['a', 'b', 'c', 'd'], dtype='object')>>> ser2.index = ['A','B','C','D']>>> ser2A    1B    3C    5D    7dtype: int64

对 Series 中特定数据的查找,可以通过以下几种方式来实现:

>>> ser2['A']  # 通过索引值查找值1>>> ser2[1] # 通过行号查找值3>>> ser2[0:2] # 通过切片来查找子序列A    1B    3dtype: int64

在 Series 类型运算中,输出结果会自动对齐不同索引的数据。当序列中没有共同的索引时,则输出缺失值符号 NaN :

>>> ser3 = pd.Series([1,3,5],index=['a','b','c'])>>> ser4 = pd.Series([2,4,6],index=['c','d','b'])>>> ser3 + ser4a    NaNb    9.0c    7.0d    NaNdtype: float64

上述这种运算机制在数据处理中非常有用,按照索引来进行运算可以避免错误分行。总结:Series 基本操作类似数组和字典,它们之间可以相互转换。但是,序列是顺序指定的、具有索引的数据类型。数组是没有索引的,而字典的元素是无序的。

Dataframe

DataFrame是将若干个 Series 按列合并而成的二维数据结构,每一列单独取出来就是一个 Series 。数据框 DataFrame是用于存储多行和多列的数据集合,是机器学习算法读取数据的最常用格式。就像日常见到的二维 Excel 表格一样,第一行默认表示变量名,后续每行为一个样本,而每列表示变量(特征)的取值。利用数据框之前需要导入处理数据的核心库 pandas 。下列几行代码基本包括了 DataFrame 的创建。

>>> import pandas as pd   # 导入 Python 库 pandas>>> dic1 = {"age":[18,20,22],"name":["xiaoming","wanghan","hanwei"],"Chinese":[90,78,97],"Math":[87,69,89],"English":[98,78,83],"History":[86,79,80],"Physics":[99,78,94]}>>> df = pd.DataFrame(dic1,index=['a','b','c'])>>> print(df)   age      name  Chinese  Math  English  History  Physicsa   18  xiaoming       90    87       98       86       99b   20   wanghan       78    69       78       79       78c   22    hanwei       97    89       83       80       94

从上面实例可以看出,数据框是由字典 data 直接转化而来。实际数据分析中,采集到的数据结构往往是多种类型的,而数据框恰好可以存放不同类型的数据。另外,利用 Python 读取的数据往往自动转化为数据框类型的,如前面介绍的读取本地数据命令 pd.read_csv() 。

01

 了解数据全貌

一旦把数据载入到 Python 中,首先要做的是了解数据的全貌与基本特征。例如,要知道数据框大小(行和列)、列变量名、索引号、数据类型等。如果想知道数据框的列变量与索引名称,可以使用如下命令

>>> print(df.columns)  # 列变量名称Index(['age', 'name', 'Chinese', 'Math', 'English', 'History', 'Physics'], dtype='object')>>> print(df.index)  # 索引序列Index(['a', 'b', 'c'], dtype='object')>>> print(df.shape) # 行数与列数(3, 7)

另外,Python 中存在一些内置函数可以输出许多数据框属性,例如:

>>> df.info()   # 整体汇总<class 'pandas.core.frame.DataFrame'>Index: 3 entries, a to cData columns (total 7 columns):age        3 non-null int64name       3 non-null objectChinese    3 non-null int64Math       3 non-null int64English    3 non-null int64History    3 non-null int64Physics    3 non-null int64dtypes: int64(6), object(1)memory usage: 168.0+ bytes>>> df.describe()  # 对每一列数值型数据进行统计,包括计数、均值、标准差、标准差、各个分位数等        age    Chinese    ...        History    Physicscount   3.0   3.000000    ...       3.000000   3.000000mean   20.0  88.333333    ...      81.666667  90.333333std     2.0   9.609024    ...       3.785939  10.969655min    18.0  78.000000    ...      79.000000  78.00000025%    19.0  84.000000    ...      79.500000  86.00000050%    20.0  90.000000    ...      80.000000  94.00000075%    21.0  93.500000    ...      83.000000  96.500000max    22.0  97.000000    ...      86.000000  99.000000[8 rows x 6 columns]>>> df.describe(include=["object"])  # 基本统计描述(指定变量为类别型)           namecount         3unique        3top     wanghanfreq          1

02

 访问数据

访问数据框一列与若干列的常用的方法有如下两种:

>>> df["name"]  # 按列变量访问a    xiaomingb     wanghanc      hanweiName: name, dtype: object>>> df.iloc[:,3]  # 按照列数访问,这里表示第二列对应的所有行a    87b    69c    89Name: Math, dtype: int64>>> df[["name","age","Math"]]  # 指定列变量名       name  age  Matha  xiaoming   18    87b   wanghan   20    69c    hanwei   22    89>>> df.iloc[:,:3]  # 按照列数访问,这里表示前两列对应所有行   age      name  Chinesea   18  xiaoming       90b   20   wanghan       78c   22    hanwei       97>>> df.head()  # 默认输出前五行   age      name  Chinese  Math  English  History  Physicsa   18  xiaoming       90    87       98       86       99b   20   wanghan       78    69       78       79       78c   22    hanwei       97    89       83       80       94>>> df.tail()  # 默认输出后五行   age      name  Chinese  Math  English  History  Physicsa   18  xiaoming       90    87       98       86       99b   20   wanghan       78    69       78       79       78c   22    hanwei       97    89       83       80       94

类似的,访问数据框的行有如下几种方法:

>>> df[1:2]  # 取第二行   age     name  Chinese  Math  English  History  Physicsb   20  wanghan       78    69       78       79       78>>> df.iloc[1,:] # 按照行数访问,这里表示第二行对应的所有列age             20name       wanghanChinese         78Math            69English         78History         79Physics         78Name: b, dtype: object>>> df.iloc[0:2,] # 前两行的所有列   age      name  Chinese  Math  English  History  Physicsa   18  xiaoming       90    87       98       86       99b   20   wanghan       78    69       78       79       78>>> df.iloc[1,1] # 第二行第二列'wanghan'

03

 数字特征统计

既然数据框是个数据集合,那么我们经常需要对其进行一些基本统计描述。下面几行代码给出了常用的统计描述的操作:

>>> print(df.mean()) # 默认对数值型的所有列分布求平均age        20.000000Chinese    88.333333Math       81.666667English    86.333333History    81.666667Physics    90.333333dtype: float64>>> df.sum() # 列求和,方式类似 meanage                           60name       xiaomingwanghanhanweiChinese                      265Math                         245English                      259History                      245Physics                      271dtype: object>>> df.max()  # 求最大值,求最小值用 df.min()age              22name       xiaomingChinese          97Math             89English          98History          86Physics          99dtype: object>>> df.isnull()  # 布尔值输出,检查每列是否有缺失值     age   name  Chinese   Math  English  History  Physicsa  False  False    False  False    False    False    Falseb  False  False    False  False    False    False    Falsec  False  False    False  False    False    False    False>>> df['age'].unique()  # 该列不同值的个数array([18, 20, 22], dtype=int64)>>> df['age'].value_counts()  # 统计某一列 'age' 中各个值出现的次数18    122    120    1Name: age, dtype: int64

python处理一亿条数据_Python基础数据处理库相关推荐

  1. [译] 使用 python 分析 14 亿条数据

    原文地址:Analysing 1.4 billion rows with python 原文作者:Steve Stagg 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold ...

  2. 如何用 Python 分析 14 亿条数据?

    (点击视学算法公众号,可快速关注) 英文:Steve Stagg,翻译:Ryden Sun juejin.im/post/5aceae206fb9a028d2084fea Google Ngram v ...

  3. python 抓取微博评论破亿_如果利用Python分析14亿条数据!资深程序员手把手教你!过亿级!...

    挑战 1-gram 的数据集在硬盘上可以展开成为 27 Gb 的数据,这在读入 python 时是一个很大的数据量级.Python可以轻易地一次性地处理千兆的数据,但是当数据是损坏的和已加工的,速度就 ...

  4. python用http协议传数据_python基础 -- 简单实现HTTP协议

    标签: 一.直接代码 # -*- coding: utf-8 -*- import socket __author__ = 'lpe234' __date__ = '2015-03-12' if __ ...

  5. Python对百亿条(100GB)数据进行查重

    前言 在我们处理大数据过程中,总会有找出重复数据的情况,上百亿条数据中找出重复的数据,看起来比登天还难,但Python告诉你几行代码轻松搞定这一切!不说废话,上干货! 生成72个BIN文件,每个BIN ...

  6. MySQL该如何将月增上亿条数据的单表处理方案优雅落地?

    引言 分库分表实战内容基本上很少有人去分享,在网上能够搜出来的也大多属于一些方法论,但大部分技术开发真正缺少的恰恰是这些实操经验,所以后续的内容多以实践为主,携手诸位真正彻底悟透分库分表相关的技术. ...

  7. mysql 5000万条数据库_1亿条数据如何分表100张到Mysql数据库中(PHP)

    下面通过创建100张表来演示下1亿条数据的分表过程,具体请看下文代码. 当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过 ...

  8. 1亿条数据如何分表100张到Mysql数据库中(PHP)

    来源:http://www.jb51.net/article/70265.htm 这篇文章主要介绍了当数据量猛增的时候如何把一亿条数据分表100张到Mysql数据库中,需要的朋友可以参考下 下面通过创 ...

  9. mysql一张表1亿天数据_1亿条数据在PHP中实现Mysql数据库分表100张

    转: 1亿条数据在PHP中实现Mysql数据库分表100张 http://php-z.com/thread-2115-1-1.html (出处: PHP-Z) 当数据量猛增的时候,大家都会选择库表散列 ...

最新文章

  1. 1、使用库函数计算两个向量的夹角
  2. 和ts一般怎么玩_KPL:一诺采访引热议,quot;裴擒虎是个野王都会quot;,暖阳怎么办?...
  3. 西门子rwd60参数设置调试手册_西门子控制器RWD60
  4. 128. Longest Consecutive Sequence
  5. 零位扩展和符号位扩展
  6. Python 获取指定文件夹下的目录和文件
  7. 在Matlab命令窗口中执行,交互式命令操作就是在MATLAB命令行窗口中输入命令并执行。...
  8. ipad UISplitViewController 导航视图控制器标题设置
  9. java多线程 生产者消费者_java多线程之生产者消费者经典问题 - 很不错的范例
  10. 一台7纳米光刻机月产能有多大,何为能卖上亿美元?
  11. 远程连接电脑_Python黑科技:在家远程遥控公司电脑,python+微信一键连接!
  12. socketserver剖析.html
  13. mysql 慢查询日志记录
  14. Ubuntu 14.04安装LAMP(Linux,Apache,MySQL,PHP)
  15. CSS中如何设拉伸背景图片铺满屏幕
  16. Elsevier LaTeX 模板中参考文献没有序号,且文章引用不是序号引用
  17. 【深入浅出向】从自信息到熵、从相对熵到交叉熵,nn.CrossEntropyLoss, 交叉熵损失函数与softmax,多标签分类
  18. WEEK5 周记 作业——差分数组_TT的魔法猫
  19. flask中for循环
  20. 资产配置神器--美林时钟帮你获取超额收益

热门文章

  1. 初始化环境配置:CentOS 7.4x64 系统安装及基础配置
  2. Ubuntu 扩展内存或断电之后卡在 /dev/sda1 clean 和 /dev/sda1 recovering journal
  3. python绘画_python学画画(上)
  4. 开源开放 | Beyond 预训练语言模型,NLP还需要什么样的知识?
  5. jieba分词太慢,怎么办?找jieba_fast
  6. Android官方开发文档Training系列课程中文版:支持不同的设备之支持不同的屏幕
  7. 基于携程游记的出行领域顺承事件图谱项目
  8. 【HTML/CSS】HTML元素种类的划分
  9. SpringBoot整合Dubbo+Zookeeper进行分布式搭建系统
  10. mac brew install nginx遇到的坑