《Python数据科学手册》笔记

IPython 超越Python

IPython: interactive Python ,交互式Python编程

Jupyter Notebook 是 IPython shell 基于浏览器的图形界面,虽然其是在网页上进行代码的查看和编辑,但还是要和一个正在运行的Python进程进行连接,这个进程被称为核(kernel)

IPython的一些使用技巧:

1、使用符号?获取文档
In [1]: len?  
Signature: len(obj, /)
Docstring: Return the number of items in a container.
Type:      builtin_function_or_method

#  2、使用符号??获取源代码   
In [2]: def add_two_num(a,b):
   ...:     '''计算两个数的和 '''
   ...:     return a+b
In [3]: add_two_num??   
Signature: add_two_num(a, b)
Source:   
def add_two_num(a,b):
    '''计算两个数的和    '''
    return a+b
File:      ~/<ipython-input-7-250102af8d49>
Type:      function
#??有时不能显示源代码,这是因为查询的对象并不是用Python实现的,而是C语言或其他编译扩展语言实现的。

3、使用Tab补全代码

4、'*'通配符的补全

魔法方法
5、%paste:粘贴代码   %paste 命令同时输入并执行复制的代码 (%cpaste 可持续粘贴 )

6、%run 执行外部代码   %run  py路径

7、%timeit 计算单行代码执行的精确时间 
   %time   对单个语句的执行时间进行计时
In [4]: %timeit a = 1
16.1 ns ± 0.289 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
# 若是计算代码块的时间 使用 %%timeit


8、IPython 中创建了叫作 In 和 Out 的 Python 变量,这些变量自动更新以反映命令历史 
print(In) #  打印列表,按照顺序记录所有的命令
            #(列表中的第一项是一个占位符,以便 In[1] 可以表示第一条命令
Print(Out)  #打印字典,它将输入数字映射到相应的输出(如果有的话)

9、在句子的结尾输入 ; 可以禁止在Out中输出

10、使用%prun分析函数的执行时间 ,
    %lprun逐行分析函数的执行时间(需要先pip install line_profiler)

NumPy入门

有效地存储和操作数值数组是数据科学中绝对的基础过程,Numpy包就是处理这些数值数据的工具之一。

Numpy(Numerical Python):提供了高效存储和操作密集数据缓存的接口

Python的数据类型

Python是一门动态类型的语言

标准的Python实现是用C语言编写的,这意味着每一个Python对象都是一个聪明的伪C语言结构体,该结构体不仅包含其值,还有其他信息,这也就意味着Python的int不是真正的int 🧐


C 整型和 Python 整型的区别.png

注意:和Python 列表不同,NumPy数组是固定类型的。
这意味着当你试图将一个浮点值插入一个整型数组时,浮点值会被截短成整型。
举个例子:
a = np.array([3, 4]) ; a[1] = 1213.321312321 ; 输出a array([ 3, 1213])

Numpy的基本使用

  import numpy as np  #标准导入方法  

  #从Python列表创建数组
  >>> np.array([3.14, 4, 2, 3])  #NumPy要求数组必须包含同一类型的数据
  array([3.14, 4.  , 2.  , 3.  ])

  #用dtype关键字指定元素类型
  >>> np.array([3, 4, 2, 3],dtype='float64')
  array([3., 4., 2., 3.])
  

  #zeros()、ones()、full()、arange()、linspace()
  #random.random()/random.randint()/random.normal()、eye()、empty()
  >>> np.zeros(10, dtype=int) #创建一个长度为10的数组,数组的值都是0 注意其shape为(10,)
  array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
  >>> np.ones((3, 5), dtype=float)
  array([[1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1.]])
  >>> np.full((3,5),31)
  array([[31, 31, 31, 31, 31],
         [31, 31, 31, 31, 31],
         [31, 31, 31, 31, 31]])
  >>> np.arange(0,10,2) # 类似于python内置的range函数
  array([0, 2, 4, 6, 8])  
  >>> np.linspace(1,2,5) #创建等差数列  创建一个5个元素的数组,这5个数均匀地分配到1~2
  array([1.  , 1.25, 1.5 , 1.75, 2.  ])
  >>> np.random.random((3, 3)) #创建一个3×3的、在0~1均匀分布的随机数组成的数组
  array([[0.29754805, 0.10436244, 0.11162626],
       [0.20406406, 0.48309063, 0.80017593],
       [0.94510514, 0.08344147, 0.13553327]])
  >>> np.eye(2) # 创建单位矩阵
  array([[1., 0.],
         [0., 1.]])
  >>> np.empty(3) #创建空数组 注意数组内的值不为空,而是一些垃圾值
  array([2.21442477e-314, 2.21454033e-314, 0.00000000e+000])
  
数组的操作:
1.确定数组的大小、形状、存储大小、数据类型 -  ndim、shape、size,dtype

2.获取和设置数组各个元素的值 - 索引 a[-1] a[1,2](a[1][2])

3.在大的数组中获取或设置更小的子数组 - 切片 
切片方式: x[start: stop: step] 
这里有个逆序小技巧:x[::-1]
>注意:数组切片返回的是数组的视图,而不是副本(便于大数据集的操作)
      修改切片会反映到原始数据上,这一点和python内置的list不一样
      如果不想改变原始数组的话,可以使用copy()方法

4.改变给定数组的形状 - reshape  np.newaxis(反正自己没怎么用过)

5.数组的拼接和分裂
拼接 np.concatenate  np.vstack(垂直栈/行)   np.hstack (水平栈/列)
第一个参数: 数组元组或数组列表

分裂 np.split、np.hsplit  np.vsplit
  >>> x = [1, 2, 3, 99, 99, 3, 2, 1]
  >>> x1, x2, x3 = np.split(x, [3, 5])   #np.split(数组,[分裂点位置列表])
  >>> print(x1, x2, x3)
  [1 2 3] [99 99] [3 2 1]

Numpy的强大之处-向量化操作

处理瓶颈并不是运算本身,而是CPython在每次循环时必须做数据类型的检查和函数的调度


numpy中向量化有两种形式,
一元通用函数(unary ufunc),对单个输入操作;
二元通用函数(binary ufunc),对两个输入操作;

np.abs(x) np.sin(x)  np.exp(x) np.exp2(x)) np.log(x)
np.power(次方数,x)  等价于  x**次方数


一般在面对大量数据的时候,第一步是计算相关数据的概括统计值,最常用的包括有
求和、乘积、中位数、最小值和最大值、分位数、均值、标准差

#求和 sum(x)  np.sum(x)
In [1]:big_array = np.random.rand(1000000)
      %timeit sum(big_array)
      87 ms ± 2.64 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
      %timeit np.sum(big_array)
      409 µs ± 4.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

ps:针对数据的求和、求最大值、最小值,使用np.sum(x)、np.max(x)、np.min(x)更快

#对于多维度的数组来说
In [2]: M = np.random.random((3, 4))
In [3]: M.sum()  #对二维数组进行求和  M.sum() 而不是sum(M) sum(M)会得到每一列的和
Out[3]: 4.277430157572991
In [4]: sum(M)
Out[4]: array([1.36862191, 1.39587722, 0.69730366, 0.81562737])
In [5]: M.min(axis=0) # 注意参数 axis  0 沿着行  1 沿着列
Out[5]: array([0.03183734, 0.23139794, 0.10978954, 0.07375324])

Numpy的比较、布尔逻辑(& | ~)、掩码操作

In [6]: x = np.array([1, 2, 3, 4, 5])
In [7]: x <  3
Out[7]: array([ True,  True, False, False, False])

In [13]: x = np.random.randint(10,size=(2,3))
In [14]: x
Out[14]: 
array([[4, 1, 9],
       [7, 7, 6]])
In [15]: np.count_nonzero(x < 6)   # np.count_nonzero统计记录的个数
Out[15]: 2
等价于
In [16]: np.sum(x < 6)   #由于True = 1  False = 0
Out[16]: 2

# 掩码操作
In [21]: x
Out[21]: 
array([[4, 1, 9],
       [7, 7, 6]])

In [22]: x<5
Out[22]: 
array([[ True,  True, False],
       [False, False, False]])

In [23]: x[x<5]   #返回的是一个一维数组,它包含了所有满足条件的值
Out[23]: array([4, 1])

Numpy的花式索引

利用fancy indexing,结果的形状与索引数组的形状一致,而不是与被索引数组的形状一致


In [30]: x = np.random.randint(100, size=10)
In [31]: x
Out[31]: array([77, 3, 62, 45, 98, 10, 54, 8, 38, 16])
In [32]: ind = np.array([[3,7],[4,5]])
In [33]: x[ind]
Out[33]: 
array([[45,  8],
       [98, 10]])

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343