Python 数据分析学习笔记: numpy 篇

Python 数据分析学习笔记:numpy篇

前言

数据分析的主要库是 pandas,而 numpy 是 pandas 的基础,numpy 中的语法在 pandas 中基本都能使用,所以先学习 numpy。

一.数组的创建

知识点:

  1. 用赋值法创建 array 数组;
  2. array 数组的 ndim 属性;
  3. array 数组的 shape 属性;
  4. array 数组的 dtype 属性;
  5. array 数组的 zeros 方法;
  6. array 数组的 ones 方法;
  7. array 数组的 arange 方法;
  8. array 数组的 reshape 方法。

*赋值法是写出数组内容并赋值,注意,多维的 array 中,最外层也要用中括号[ ]括起来

*新创的 array 数组中可以引用已经生成过的 array 数组

*array.ndim 返回 array 的维度值(也称为:秩),dim 是 dimension (英文含义为:维度)的缩写

*(3,3,3)的含义为:3个2维数组,每个2维数组包含3个1维数组,每个1维数组包含3个元素

*arange 有3种效果:

  • 当只有一个参数 n 时,产生一个从0到 n-1 的一维数组(共 n 个数字)

  • 当有两个参数 start, end 时,产生一个从起点数 start 到终点数 end-1 ,步长为 1 的一维数组

  • 当有三个参数 start end num 时,产生一个从起点数 start 到终点数 end-1 ,步长为 num 的一维数组

*注意,这里是 arange ,而不是英文单词 arrange (英文含义:安排),之所以用 arange ,应该是为了和 Python 自带的 range 方法区别开来,但其实两者产生的效果是类似的

*使用 array.reshape(x,y,z) 时,要保证 array 中的元素个数等于 x,y,z 三个数字的积,否则程序会报错,如:2×3×4=24

总结

  • numpy 的处理对象主要是 array 数组,array 数组类似于 Python 自带的 list 数组,都使用中括号。
  • 生成 array 数组最简单的办法是直接赋值,如 a = np.array([1,2,3])。也可以用已经生成的 array 数组给新的 array 数组赋值。 array 数组可以有任意维度,但是无论多少维度,最外层都要用中括号括起来。
  • 除了直接赋值,还有一些生成有特定规律 array 数组的办法:包括生成全 0 数组的 zeros 方法,生成全 1 数组的 ones 方法,生成等差数列的 arange 方法。
  • array 数组的主要属性是 ndim, shape, dtype,其中:
* ndim 是数组的维度数,又称秩;
* shape 是数组的型,描述数组在每一个维度上的数量分布,如(2,3,4)代表该数组包括2个二维数组,每个二维数组包括3个一维数组,每个一维数组包括4个数字。如果想改变 array 数组的型,可以用 reshape 方法;
* dtype 是数组的数据类型,下一节会有详述。

二.数据类型与数据类型的转换

知识点:

  1. array 的主要数据类型;
  2. 用 reshape 方法转换数据类型;

array 主要数据类型包括:

  • 布尔型 bool;
  • 整数型 int(包括 int8,int16,int32 等);
  • 非负整数型 uint(又称无符号整数,从0开始,包括 uint8 等);
  • 浮点数型 float(包括 float16,float32 等);
  • 复数型 complex(包括 complex64 和 complex128);
  • 字符串型 str

*注意,如果直接输入布尔值,不要加引号(加引号就是 str 型),并要记得将 True 和 False 的首字母大写,否则会报错

*可以使用 astype 方法改变 array 数组的数据类型,注意 astype 的参数需要用引号括起来

*布尔值与数字的对应关系是:True 对应 1,False 对应 0

三.切片索引

知识点:

  1. 一维数组切片方式;
  2. 高维数组切片方式;
  3. 浅复制与深复制。

*一维数组切片有三种方式:

  • 如果仅有一个参数 n(a[n]),则取出数组的第 n + 1 个元素

  • 如果有两个参数 start end(a[start,end]),则取出数组的第 start + 1 个到 end 个间的元素

  • 如果有三个参数 start end step(a[start,end,step]),则以 step 为步长,取出数组的第 start + 1 个到 end 个间的元素

*当 start 省略时,则认为是从第一个元素开始取,当 end 省略时,则认为是取到最后一个元素

*start 和 end 均可以为负数,start 的负数(如 -n)表示为从倒数第 n 个数开始取,而 end 的负数(如 -n)则表示为取到倒数第 n + 1 个数

*步长 num 不能为负值,否则会返回一个空数组

*对于高维数组,继承了一维数组的切片方式,此外,用多个[ ]在不同维度依次切片

*多个[ ]也可以写在一个[ ]中,用逗号连接

*一维数组的表达方式在高维数组中一样适用

*将 array 数组切片并复制给其他数组有两种形式,一种是浅复制,另一种是深复制。在浅复制中,新数组元素的改变会反过来影响原数组,而在深复制中则不会:无论新数组怎么变,都不会影响原数组

*之所以会这样,是出于节约内存的考虑,浅复制不占用新的内存,而深复制会占用新的内存,浅复制后新数组实际上还是用的原数组内存,因此在这种情况下改变新数组元素,就是在改变原数组

*当切片为单一元素时,因为单一元素耗内存较小,所以新数组采用深复制,结果是新数组发生的改变不会影响到原数组

*如果切片不止一个元素,新数组采用浅复制,对新数组元素进行改变,其实就是对原数组改变

*如果不希望采取浅复制,则可以在对新数组复制时采用 copy 方法,这样就是新建内存存储新数组了,这样一来新数组的变化就不会影响到原数组

总结

  • 一维数组切片方式为 array[start: end: step],其中 start 和 end 均能是负数,代表从后往前数,start 和 end 也能省略,代表从第一个开始取和取到最后一个;

  • 一维数组的取数原则是取左不取右;

  • 多维数组继承了一维数组的语法,此外针对高维度用多个[ ]依次切片,多个[ ]也可以写在一个[ ]中,用逗号分隔;

  • 将原数组切片后复制给新数组有两种复制方法,浅复制和深复制,其中浅复制不开启新内存,深复制开启新内存,在浅复制中新数组的改变也就是原数组的改变,而深复制中新数组的改变不影响原数组;

  • 如果原数组只切片出一个元素并复制给新数组,则复制方法为深复制,因为一个元素占内存较小,可以开启新内存;

  • 如果原数组切片出不止一个元素并复制给新数组,则复制方法为浅复制以节约内存,因此新数组的改变也就是原数组的改变;

  • 浅复制情况下如果想改为深复制,可以在复制时使用 copy 方法,这样新数组就拥有独立的内存,它的改变就不会影响原数组了

四.布尔索引

知识点:

  1. 大于,小于,大于等于,小于等于,整除,非整除等布尔运算的程序表达;
  2. 或,与,非 等布尔运算的程序表达;
  3. 一维数组的布尔索引;
  4. 多维数组的布尔索引

*大于,小于,大于等于,小于等于在 numpy 中的表达为 " > "," < "," >= "," <= "

*" > "," < "," >= "," <= "在 numpy 中是一种运算符,和 " + "," - " 是一样的,用于判断等式是否成立,运算结果是 True 或者 False

*numpy 中的整除、非整除判断要用到两个符号:分别是 " % " 和 " == "(两个等号),其中" % "代表除后取余数," == "相当于数学上的" = ",在程序是一种运算符,判断等式两边是否相等,返回 True 或者 False,而" = "(一个等于号)在 Python 中是赋值符号,不是逻辑判断符号

*numpy 中 "或" 的表达为 " | ",注意,不能用 or 替换 " | "

*"与" 的表达为 " & ","非" 的表达为 " ~ "

*一维数组和高维数组的布尔索引方式一样,都是在数组后加上[ ],并在其中写明布尔运算式

总结

  • 所谓布尔运算就是比较布尔运算符前后的元素,看其是否符合布尔运算符代表的含义,并最终输出布尔值(True,False)的运算过程;
  • numpy 中的布尔运算符包括:大于( > ),小于( < ),大于等于( >= ),小于等于( <= ), 等于( == ),同时还能用或( | ),与( & ),非( ~ )将多个布尔运算联立;
  • numpy 中整除的符号为 % ;
  • numpy 中通过布尔运算进行布尔索引,布尔索引的格式和切片索引类似,均是以[ ]为符号,只是布尔索引时[ ]中填入的是布尔运算式;
  • numpy 中的高维数组布尔索引和一维数组布尔索引方式没有区别

五.广播与转置

知识点:

  1. 广播的方法;
  2. 转置的方法

*所谓广播就是全体数组元素均参与的计算,包括整体广播,按行广播,按列广播(二维数组),按点广播

*整体广播在 array 数组和另一个与之同型(shape)的 array 数组间进行,两个数组间位置对应的元素发生计算

*按点广播是 array 数组的每一个元素均和一个数字标量(如:3,5,29)进行运算

*按行广播是一个二维的 array 数组与一个同行宽的数组进行的运算

*按列广播是一个二维的 array 数组与一个同列长的数组进行的运算

*转置是将原 array 数组的列变成行,行变成列,快捷方式是 T 方法(对应英文单词 transpose,记得大写),同时也可以用 reshape 进行转置

总结

  • array 数组的整体运算被称为广播(如果不想整体运算,可以先切片索引或布尔索引再运算)

  • 广播的方式包括整体广播(同型广播),按行广播,按列广播,按点广播;

  • 转置是将行变成列,列变成行,快捷方法是 T 方法(对应英文单词 transpose,记得大写),同时也可以用 reshape 实现

六.数组的连接

知识点

  • concatenate 方法
  • stake 方法

*数组与数组相连接的方法是 concatenate(英文含义:连接),concatenate 中,要连接的数组用元组形式作为方法的第一个参数,第二个参数是 axis ,默认为 0,影响连接方法:针对一维数组,axis 只能为 0,数组按照元组的先后顺序连接(有一点我没有搞清,元组应该是没有先后顺序的)。针对二维数组,axis 为 0 时数组按上下连接,axis 还可以指定为 1,此时数组按左右连接。

*注意,在运用 concatenate 方法时,即使省略 axis 参数(默认为 0),要连接的数组也要用元组的形式(不能省掉元组的括号),否则会报错

*针对二维数组,axis 为 0 时数组按上下连接,axis 还可以指定为 1,此时数组按左右连接。

*用 concatenate 连接时,两个数组可以不同型,但不能创造空值位(如果这里的 a 与 b 纵向相连,a 的第三列将为空值)

*stack 方法也是连接数组的方法,但是和 concatenate 不同,concatenate 不会增加连接后数组的维度,而 stack 会,比如从 1 维升到 2 维,2 维升到 3 维。同时,concatenate 不要求连接的数组一定要同型,但 stake 则要求一定要同型

总结

  • 数组的连接用 concatenate 方法或者 stack 方法,其中 concatenate 方法不会改变数组维度,stack 方法会增加一个数组维度;

  • 对于二维数组而言 concatenate 既可以上下连接(默认),也可以左右连接(要设置 axis = 1 ),对于一维数组,concatenate 只能前后连接;

  • stack 连接的数组必须同型,concatenate 则不一定(只要不创造空值)

七.随机数

知识点

  • np.random.randint();
  • np.random.randn();
  • np.random.normal();
  • np.random.permutation();
  • np.random.choice();
  • np.save();
  • np.load()

*choice 方法中 p(probability,中文意思是:概率)的各项和为 1,否则会报错

总结

  • np.random.randint(low,high,size):生成 low 与 high 之间的随机整数(取左不取右),size 用于指定要生成数组的型(shape);

  • np.random.randn(size):生成一个型为 size 的标准正态分布(均值为 0,标准差为 1)数组;

  • np.random.normal(mean = 0,standard deviation = 1,size):生成一个均值为 mean,标准差为 standard deviation,型为 size 的数组;

  • np.random.permutation(a):两种模式,如果 a 是一个正整数,则生成一个 0 ~ n-1 的随机排列数组,而如果 a 是一个 array 数组,则生成一个将原 array 元素随机打乱的新数组,其中 permutation 的英文名为:排列;

  • np.random.choice(array,size = 1,p = none):在数组 array 中按照概率分布 p(列表形式,是英文 probability 的缩写,含义为:概率) 抽取型为 size 的数组;

  • np.save(file,array):将数组 array 保存为 file,file 包含路径,文件名和文件格式,路径如果省略则为当前 Python 程序运行路径,文件格式如果省略则为 npy 格式(numpy 专属格式)

  • np.load(file):读取文件中的数据,file包含路径,文件名和文件格式,路径如果省略则为当前 Python 程序运行路径

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

推荐阅读更多精彩内容