Numpy基础入门

一. Numpy的主要功能

  • 数组的算数和逻辑运算。
  • 傅立叶变换和用于图形操作的例程。
  • 线性代数有关的操作。 NumPy 拥有线性代数和随机数生成的内置函数。

二. Numpy的基本数据结构

Numpy提供的核心功能是数组,所以它的最基本的数据结构就是多维数组结构Ndarray。Ndarray无论是运算速度,还是功能函数都比list结构要更好。该结构的特点如下:

  1. 数组中所有的元素类型相同。
  2. 每个元素在内存中的块大小相同。
  3. 数组的维度信息存放在shape属性,类型信息存放在dtype属性。

三. Ndarray结构的基本使用

1. 创建Ndarray
  1. 直接使用np.array()创建
    numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
    object参数,接受一切序列型的对象,用于创建数组。
    dtype参数,为数组指定一个类型
    order参数,(C语言风格)按行显示数组='C'; 或者(Fortran语言风格)按列显示数组='F'
    ndmin参数,指定数组的最小维度
# 最小维度  
import numpy as np 
a = np.array([1, 2, 3, 4, 5], ndmin =  2, dtype=np.float)  #本来是一维数组,强行控制它为二维数组
print (a)

Out:
[[1.0, 2.0, 3.0, 4.0, 5.0]]
  1. 固定填充元素创建
    创建空数组:numpy.empty (shape, dtype = float, order = 'C')
    创建全0数组:numpy.zeros (shape, dtype = float, order = 'C')
    创建全1数组:numpy.ones (shape, dtype = None, order = 'C')

shape参数,整数表示一维数组的长度,元组表示多维数组的形状。

  1. 从已有数据中创建
    从其他序列创建 numpy.asarray(object, dtype = None, order = None)
    该函数类似于np.array(),主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会。
    从迭代器创建 numpy.fromiter(iterable, dtype, count = -1)
    count参数,读取的数据量,-1表示所有数据

  2. 给定范围生成数组

  • 按步长 numpy.arange(start, stop, step, dtype)

  • 按间隔数量 numpy.linspace(start, stop, num, endpoint, retstep, dtype)

2. Ndarray的常用属性
  • ndarray.shape 数组维度
  • ndarray.dtype 数组类型
  • ndarray.ndim 数组最小维度
  • ndarray.itemsize 数组每个元素的字节长度
3. Ndarray的切片与索引
  1. 下标索引:同Python,下标从0开始。
  2. 切片:与Python相同,Ndarray的切片依旧使用 [开始下标:终止下标(不包含):步长]的格式。
    可以使用省略号...,表示某个维度的所有元素
arr=np.asarray([[1,2,3,4],[5,6,7,8]])
print(arr)
print(arr[...,1])# 打印第2列所有元素

Out:
[[1 2 3 4]
 [5 6 7 8]]

[2 6]

注意:Numpy切片与Python序列切片最大的不同在于,ndarray切片返回值是原数组的视图,修改切片会影响原数组;而Python序列的切片返回值是副本,与原序列没关系。如果需要ndarray的切片副本,需要显示复制a=arr[2:5].copy()

4. Ndarray的高级索引
  1. 整数索引
    以前访问多维数组的时候,我们使用多个中括号来表达不同的轴,比如下图。这种方式一次只能访问一个元素。
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[1][0])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

6

如果我们使用的中括号的数量小于数组的维度,那么更高级的轴将被全选,比如下图。

arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[1])

out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[6 7 8]

但是对于更高级的轴,我们不想全选,只想选取若干个怎么办?这时Ndarray的特点就显现了。他可以对每个轴都进行选择,用逗号隔开每个轴之间的下标,按顺序构成坐标对,举个例子,下图中,第一个中括号表示对第一个轴的选取,第二个中括号是对第二个轴的选取,两个轴按顺序构成坐标对(0,1),(1,2),得到这2个位置的数据

arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[ [0,1],[1,2] ])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[3 8]

上面是按照坐标对来选择的,如果想选择某块数据怎么办?我们可以按轴切片,轴切片之间用逗号隔开,举个例子。

arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[:2,1:])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[[3 4]
 [7 8]]

敲黑板,总结 一下整数索引:

  • 老旧方法:1. 使用与维度数目一样的中括号来访问单个元素;2. 使用少于维度数目的中括号访问一片高维度数据。
  • Ndarray独有方法:在中括号内对所有轴做选择,不同轴用逗号隔开arr[轴1,轴2,轴3],枚举下标要用中括号包裹起来,切片不用包裹,二者可以混用。举个栗子:
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[ [0,1],1: ])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[[3 4]
 [7 8]]
  1. 布尔索引
    之前我们在某个维度选取元素的时候,使用的都是整数下标,其实可以不用下标的,而是用布尔数组,但是要求布尔数组和这个维度的长度一致。举个例子,假设我们要选择第二行所有数据:
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[ [False,True,False] ])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[[6 7 8]]

或者选择第二行,第二列和第三列的数据。方法和整数索引一样,不同的是,这次用布尔数组。

arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[[False,True,False],[False,True,True]])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[7 8]

其实Ndarray做逻辑运算的时候,会返回一个布尔数组,我们可以利用这一点,直接进行数据选择:

arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print(arr)
print (arr>2)
print(arr[arr>2])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[[False  True  True]
 [ True  True  True]
 [False False False]]

[3 4 6 7 8]

最后强调一点,布尔数组必须和筛选维度的长度一致!!!!

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

推荐阅读更多精彩内容

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