手把手教你用Python的NumPy包处理数据

导读:本文让你快速了解一下如何开始使用NumPy。一旦你熟悉了NumPy,就会发现Python世界中的大多数科学计算都是围绕NumPy构建的。因此花在NumPy上的学习时间最终对你是有益的。
(教程领到手,学习不用愁!vx:Y20200324324 备注JS即可免费领取哦!)

image

如果你已经安装了Anaconda,那么就假设你已经在虚拟环境中安装了NumPy。如果你使用过Python的标准发行版或任何其他发行版,你可以访问

http://www.numpy.org

并按照所提供的安装说明进行操作。

01 导入NumPy

一旦启动了一个新的IPython或者Jupyter会话,就可以导入Numpy模块并按照以下步骤来验证版本:

import numpy
numpy.__version__

输出结果:

1.15.4

提示:记得在Jupyter Notebook中,键入命令后,你可以按下Ctrl+Enter,以执行一个单元格。或者,按下Shift+Enter以执行单元格,并自动插入或者选择该单元格下面的单元格。依次单击Help | Keyboard Shortcut以检查所有的键盘快捷键,或者依次单击Help | User Interface Tour以进行快速浏览。

此处讨论的部分包,建议使用NumPy 1.8版本或后续版本。按照惯例,你会发现在科学Python领域中,大多数人导入NumPy都会使用np作为别名:

import numpy as np
np.__version__

输出结果:

1.15.4

02 理解NumPy数组

Python是一种弱类型的语言。这就意味着,你无论何时创建一个新变量,都不必指定数据类型。例如,下面的内容将自动表示为一个整数:

a=5

输入下面内容以再次确认:

type(a)

输出结果:

int

注意:因为标准Python实现是用C编写的,所以每个Python对象本质上是一个伪C结构。这对于Python中的整数也是如此,实际上它是指向复合C结构的指针,包含的不仅仅是原始整数值。因此,用于表示Python整数的默认C数据类型将依赖于你的系统架构(即系统是32位还是64位平台)。

更进一步,我们使用list()命令可以创建一个整数列表,这是Python中的标准多元素容器。range (x)函数将创建从0到x–1的所有整数。要输出变量,你可以使用print函数,也可以直接输入变量名字并按Enter:

int_list =list(range(10))
int_list

输出结果:

[0,1,2,3,4,5,6,7,8,9]

类似地,我们通过让Python遍历整数列表int_list中的所有元素,并对每个元素应用str()函数(该函数将一个数转换成一个字符串),来创建一个字符串列表:

str_list= [str(i) for i in int_list]
str_list

输出结果:

['0','1','2','3','4','5','6','7','8','9']

可是,用列表进行数学运算并不是很灵活。例如,我们想要将int_list中的每个元素都乘以一个因子2。执行以下操作可能是一种简单的方法—看看输出结果是怎样的:

int_list*2

输出结果:

[0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9]

Python创建了一个列表,其内容是int_list的所有元素生成了两次,这并不是我们想要的!

这就是NumPy的用武之地。NumPy是专为简化Python中的数组运算而设计的。我们可以快速将整数列表转换为一个NumPy数组:

import numpy as np 
int_arr = np.array(int_list)
int_arr

输出结果:

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

让我们看看试着将数组中的每个元素相乘会怎么样:

int_arr*2

输出结果:

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

这次我们做对了!加法、减法、除法以及很多其他运算也是同样的。

而且,每个NumPy数组都具有以下属性:

ndim:维数。

shape:每一维的大小。

size:数组中元素的总数。

dtype:数组的数据类型(例如int、float、string等)。

让我们来看看整数数组的上述属性:

print("int_arr ndim: ", int_arr.ndim)
print("int_arr shape: ", int_arr.shape)
print("int_arr size: ", int_arr.size)
print("int_arr dtype: ", int_arr.dtype)

输出结果:

int_arrndim:1
int_arrshape:(10,)
int_arrsize:10
int_arrdtype:int64

从这些输出中,我们可以看到我们的数组只包含一维,其包含10个元素且所有元素都是64位的整数。当然,如果你在32位机器上执行这段代码,你可能会得到dtype:int 32。

03 通过索引访问单个数组元素

如果你之前使用过Python的标准列表索引,那么你就不会发现NumPy中的索引有很多问题。在一维数组中,通过在方括号中指定所需的索引,可以访问第i个值(从0开始计算),与Python列表一样:

int_arr

输出结果:

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

int_arr[0]

输出结果:

0
int_arr[3]

输出结果:

3

要从数组的末尾建立索引,可以使用负索引号:

int_arr[-1]

输出结果:

9
int_arr[-2]

输出结果:

8

切割数组还有一些其他很酷的技巧,如下所示:

int_arr[2:5]#fromindex2uptoindex5-1

输出结果:

array([2,3,4])
int_arr[:5]#from the beginning up to index 5 - 1

输出结果:

array([0,1,2,3,4])
int_arr[5:]#from index 5 up to the end of the array

输出结果:

array([5,6,7,8,9])
int_arr[::2]#every other element

输出结果:

array([0,2,4,6,8])
int_arr[::-1]#the entire array in reverse order

输出结果:

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

建议你自己尝试使用这些数组!

提示:NumPy中切割数组的一般形式与标准Python列表中的相同。使用x [start: stop: step]访问数组x中的一个片段。如果没有指定任何一个值,那么默认值为start=0、stop=size of dimension、step=1。

04 创建多维数组

数组不必局限于列表。实际上,数组可以有任意维数。在机器学习中,通常我们至少要处理二维数组,列索引表示特定的特征值,行包含实际的特征值。

使用NumPy可以轻松地从头开始创建多维数组。假设我们想要创建一个3行5列的数组,所有的元素都初始化为0。如果我们不指定数据类型,NumPy将默认使用float类型:

arr_2d = np.zeros((3, 5))

arr_2d

输出结果:

array([[0.,0.,0.,0.,0.],
       [0.,0.,0.,0.,0.],
       [0.,0.,0.,0.,0.]])

使用OpenCV时你可能就知道:这可以解释为所有像素设置为0(黑色)的一个3×5的灰度图像。例如,如果你想要创建具有3个颜色通道(R、G和B)2×4像素的一个小图像,但是所有像素都设置为白色,我们将使用NumPy创建一个3×2×4的三维数组:

arr_float_3d=np.ones((3,2,4))
arr_float_3d

输出结果:

array([[[1.,1.,1.,1.],[1.,1.,1.,1.]],
      [[1.,1.,1.,1.],[1.,1.,1.,1.]],
      [[1.,1.,1.,1.],[1.,1.,1.,1.]]])

这里,第一维定义颜色通道(OpenCV中的蓝色、绿色和红色)。因此,如果这是真实的图像数据,我们可以通过切割数组轻松地获得第一个通道中的颜色信息:

arr_float_3d[0, :, :]

输出结果:

array([[1.,1.,1.,1.],
      [1.,1.,1.,1.]])

在OpenCV中,图像要么是值在0到1之间的32位浮点数组,要么是值在0到255之间的8位整数数组。因此,使用8位整数,通过指定NumPy的dtype属性并将数组中的所有1乘以255,我们还可以创建一个2×4像素、全为白色的RGB图像:

arr_uint_3d=np.ones((3,2,4),dtype=np.uint8)*255arr_uint_3d

输出结果:

array([[[255,255,255,255],
        [255,255,255,255]],

       [[255,255,255,255],
        [255,255,255,255]],

      [[255,255,255,255],
        [255,255,255,255]]],dtype=uint8)

关于作者:阿迪蒂亚·夏尔马(Aditya Sharma),罗伯特·博世(Robert Bosch)公司的一名高级工程师,致力于解决真实世界的自动计算机视觉问题。曾获得罗伯特·博世公司2019年人工智能编程马拉松的首名。
维什韦什·拉维·什里马利(Vishwesh Ravi Shrimali),于2018年毕业于彼拉尼博拉理工学院(BITS Pilani)机械工程专业。此后一直在BigVision LLC从事深度学习和计算机视觉方面的工作,还参与了官方OpenCV课程的创建。
迈克尔·贝耶勒(Michael Beyeler),是华盛顿大学神经工程和数据科学的博士后研究员,致力于仿生视觉的计算模型研究,以为盲人植入人工视网膜(仿生眼睛),改善盲人的感知体验。他的工作属于神经科学、计算机工程、计算机视觉和机器学习的交叉领域。

本文摘编自《机器学习:使用OpenCV、Python和scikit-learn进行智能图像处理(原书第2版)》,经出版方授权发布。

image

延伸阅读《机器学习》(原书第2版)

一本基于OpenCV4和Python的机器学习实战手册,既详细介绍机器学习及OpenCV相关的基础知识,又通过具体实例展示如何使用OpenCV和Python实现各种机器学习算法,并提供大量示例代码,可以帮助你掌握机器学习实用技巧,解决各种不同的机器学习和图像处理问题。
教程领到手,学习不用愁!vx:Y20200324324 备注JS即可免费领取哦!

作者:阿迪蒂亚·夏尔马(Aditya Sharma)、维什韦什·拉维·什里马利(Vishwesh Ravi Shrimali)、迈克尔·贝耶勒(Michael Beyeler)

来源:华章科技

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