Python易筋经-numpy

“五色令人目盲,五音令人耳聋,五味令人口爽,驰骋畋猎令人心发狂,难得之货令人行妨。
是以圣人为腹不为目,故去彼取此。”[1]

numpy

NumPy数组通常是由相同种类的元素组成的,既数组中的数据项的类型必须一致。
通常先要引入numpy包:

import numpy as np

创建一个简单的一维数据:

arr1 = np.arange(5)
arr1

输出:

dtype('int64')

以上数组的数据类型为int64,除了知道数据类型之外,还要注意其形状,这一点非常重要。

arr1

输出:

array([0, 1, 2, 3, 4])
arr1.shape

输出:

(5,)

如你所见,该向量有5个元素,他们的值分别是从0到4,该数组的shape属性是一个元组,存放的是数组在每一个维度的长度。

创建多维数据

数组大于一维以后,我们习惯称之为矩阵,下面创建一个2行2列的矩阵:

metr = np.array([1,2],[3,4])

上面的矩阵是通过向array()函数传递一个由列表组成的列表得到的,接下来,我们要逐个选择矩阵的各个元素,代码如下所示。下标从0开始,如下取出第1行第1列、第2行第2列的元素:

metr[0][0] 
metr[1][1]

输出:

1
4

可见,选择数组元素是一件非常简单的事情,对于数组metr,只要通过metr[m,n]的形态,就能访问数组内的元素,其中m和n为数组元素的下标。

一维数组的切片与索引

一维NumPy数组的切片操作与Python列表的切片一样。下面先来定义包括0、1、2,直到8的一个数组,然后通过指定下标2到5来选择该数组的部分元素,这实际上就是提取数组中值为2到5的那些元素。

arr2 = np.arange(9)
arr2[2:6] 

输出:

array([2, 3, 4, 5]) 

可以用下标选择元素,下标范围从0到7,并且下标每次递增2,如:

arr2[:7:2]

输出:

array([0, 2, 4, 6])

恰如使用Python那样,也可用负值下标来反转数组:

arr2[::-1]

输出:

array([8, 7, 6, 5, 4, 3, 2, 1, 0])

处理数组形态

常用的处理数组形态的方法,先记录如下几个:

  • reshape()
  • ravel()
  • flatten()
  • transpose()
  • resize()
reshape()

将一个由0到11构成的一维数组,改变为3行4列的二维数组:

arr3 = np.arange(12).reshape(3,4)
arr3

输出:

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
ravel()

将多维数组变成一维数组
将上面的二维数据再改变为一维数组:

arr3.ravel()

输出:

array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
flatten()

其功能与ravel()相同。可是,flatten()返回的是真实的数组,需要分配新的内存空间;而ravel()函数返回的只是数组的视图。两者的区别在于返回拷贝(copy)还是返回视图(view),numpy.flatten()返回一份拷贝,对拷贝所做的修改不会影响(reflects)原始矩阵,而numpy.ravel()返回的是视图(view,也颇有几分C/C++引用reference的意味),会影响(reflects)原始矩阵。

arr3.flatten()

输出:

array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
transpose()

转置:在线性代数中,矩阵的转置操作非常常见。转置是一种数据变换方法,对于二维表而言,转置就意味着行变成列,同时列变成行。
如:创建一个0-11数字组成的一维数组,先reshape为3行4列的数组:

arr4 = np.arange(12).reshape(3,4)
arr4

输出:

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

然后对其进行转置:

arr4.transpose()

输出:

array([[ 0,  4,  8],
       [ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11]])
resize()

调整大小:函数resize()的作用类似于reshape(),但是会改变所作用的数组:
如:将arr4调整为2行6列的二维数组

arr4.resize(2,6)
arr4

输出:

array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])

堆叠数组

从深度看,数组既可以横向叠放,也可以竖向叠放。涉及许下几个方法:

  • vstack()
  • dstack()
  • hstack()
  • column_stack()
  • row_stack()
  • concatenate()

先创建两个数组a 和 b,均为3行3列的二维数据:
数组a

a = np.arange(9).reshape(3,3)
a

输出a:

array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

数组b

b = a*2
b

输出b:

array([[ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])
hstack()

水平叠加:先介绍水平叠加方式,即用元组确定ndarrays数组的形状,然后交由hstack()函数来码放这些数组。

np.hstack((a,b))

输出:

array([[ 0,  1,  2,  0,  2,  4],
       [ 3,  4,  5,  6,  8, 10],
       [ 6,  7,  8, 12, 14, 16]])

将调用hstack时a和b的入参顺序换一下再看看结果:

np.hstack((b,a))

输出:

array([[ 0,  2,  4,  0,  1,  2],
       [ 6,  8, 10,  3,  4,  5],
       [12, 14, 16,  6,  7,  8]])
vstack()

垂直叠加:使用垂直叠加方法时,先要构建一个元祖,然后将元祖交给vstack()函数来码放数组。

np.vstack((a,b))

输出:

array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])

当参数axis置0时,concatenate()函数也会得到相同的效果。实际上,这是该参数的缺省值:

np.concatenate((a,b),axis=0)

输出:

array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])
dstack()

深度叠加:除此之外,还有一种深度叠加方法,这要用到dstack()函数和一个元组。这种方法是沿着第三个坐标轴(纵向)的方向来叠加一摞数组。举例来说,可以在一个图像数据的二维数组上叠加另一幅图像的数据。

np.dstack((a,b))

输出:

array([[[ 0,  0],
        [ 1,  2],
        [ 2,  4]],

       [[ 3,  6],
        [ 4,  8],
        [ 5, 10]],

       [[ 6, 12],
        [ 7, 14],
        [ 8, 16]]])

拆分numpy数组

可以从纵向,横向和深度方向来拆分数组,相关函数有hsplit(),vsplit(),dsplit()和split()。我们即可以把数组分成相同的形状的数组,也可以从规定的位置开始切取数组。
横向拆分:对于一个3行3列数组,可以沿着横轴方向将其分解为3部分,并且各部分的大小和形状完全一致。

np.hsplit(a,3)

输出:

[array([[0],
        [3],
        [6]]), array([[1],
        [4],
        [7]]), array([[2],
        [5],
        [8]])]

这个相当于调用了参数axis = 1的split()函数:

np.split(a,3,1)

输出:

[array([[0],
        [3],
        [6]]), array([[1],
        [4],
        [7]]), array([[2],
        [5],
        [8]])]

纵向拆分:同理

np.vsplit(a,3)

输出:

[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]

深向拆分:dsplit()函数会沿着深度方向分解数组。

后记:关于本文数据的由来

玩python,最好在本地安装Anaconda,里面有notebook的运行环境,交互式的笔记notebook是最好的工具,没有之一。

  • 下载安装anaconda,运行,如下图为主界面


    anaconda.png
  • 点击"jupyter notebook",可以启动notebook运行环境,新建一个notebook python的文档,形如界面:


    notebook.png
  • 目前网上支持notebook最好的免费平台就是github了,将自己的notebook文档上传到github上可以进行分享。


  1. 老子《道德经》第十二章,老子故里,中国鹿邑。

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

推荐阅读更多精彩内容

  • 来源:NumPy Tutorial - TutorialsPoint 译者:飞龙 协议:CC BY-NC-SA 4...
    布客飞龙阅读 32,725评论 6 96
  • 基础篇NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(...
    oyan99阅读 5,115评论 0 18
  • 先决条件 在阅读这个教程之前,你多少需要知道点python。如果你想从新回忆下,请看看Python Tutoria...
    舒map阅读 2,570评论 1 13
  • 原文:Quickstart tutorial 译者:Reverland 来源:试验性NumPy教程(译) 2.1 ...
    布客飞龙阅读 1,344评论 5 52
  • NumPy是Python中关于科学计算的一个类库,在这里简单介绍一下。 来源:https://docs.scipy...
    灰太狼_black阅读 1,224评论 0 5