Numpy基础

Numpy,也就是Numerical Python。
Numpy的核心特征之一是N-维数组对象ndarray。下面代码使用标准的方式导入Numpy包,并生成小的随机数组(2行3列)。每一个数组都有一个shape属性,用来表征数组每一维度的数量; 每一个数组都有一个dtype属性,用来描述数组的数据类型。

import numpy as np

data = np.random.randn(2, 3)
print(data)
print(data*10)
print(data+data)
print(data.shape)
print(data.dtype)

np.arange方法的使用方法:

参数个数情况: np.arange()函数分为一个参数,两个参数,三个参数三种情况
1)一个参数时,参数值为终点,起点取默认值0,步长取默认值1。
2)两个参数时,第一个参数为起点,第二个参数为终点,步长取默认值1。
3)三个参数时,第一个参数为起点,第二个参数为终点,第三个参数为步长。其中步长支持小数。

1. ndarray多维数组对象

1.1 生成ndarray

生成数组最简单的方式就是使用array函数。除此之外,zeros可以一次性创造全0数组,ones可以一次性创造全1数组。empty则可以创建一个没有初始化数值的数组。arange是Python内建函数arange的数组版。

data1 = [6, 5.3, 5.9, 17]
data3 = [[1, 67, 23, 54], [3, 24, 65, 45]]     # 为了保证生成ndarray,每行的列数应该一致
arr1 = np.array(data1)
arr3 = np.array(data3)
print("\narr3的信息:---------------")
print(arr3)
print(arr3.shape)
print(arr3.ndim)
print(arr3.dtype)
arr4 = np.zeros(5)
arr5 = np.ones(5)
arr5 = np.empty(5)
arr6=np.zeros((4,3))           # 生成高维数组,需要将元组传给zeros。(4,3)
arr7=np.arrange(15)            # 类似python的arange

1.2 ndarray的数据类型:

数据类型,即dtype。dtype是NumPy能够与其他系统数据灵活交互的原因。dtype类型命名方式是:类型名,比如float和int,后面再接上表明每个元素位数的数字,例如float64。常用的数据类型记住:int64,float64,bool,string_,object,详细的可以在网上查找。可以使用astype方法来显示地转换数据类型。
使用astype时,总是生成一个新的数组,即使传入的dtype与之前一致。

arr9 = np.array([1,2,3], dtype = np.float64)
arr10 = np.array([1,2,3], dtype = np.int64)
arr11 = arr10.astype(np.float64)      # 显示地转换类型

1.3 Numpy数组算术:

Numpy允许批量操作而无需for循环,这是很方便的方面,这种特性叫做向量化。任何2个等尺寸数组之间的算术操作都应用了逐元素操作的方式,记住这种不是矩阵计算。不同尺寸的数组间的操作,将会用到广播特性

arr12 = np.array([[1,2,3],[4,5,6]])
print(arr12*0.5)
print(arr12*arr12)

1.4 基础索引和切片

数组的切片是原数组的视图。任何对于视图(array切片)的修改都会反映到原数组上。如果想要一份数组切片的拷贝而不是一份视图的话,调用copy()方法。对于高维数据,访问方法arr14[0,1]和arr14[0][1]的作用是一致的。

arr13 = np.arange(7)
arr13_slice1 = arr13[1:3]     # 切片范围是左开右闭,例如这个实际上的寻址序列是[2,4)  结果是:array([1, 2])
print(arr13)
print(arr13_slice1)
arr13_slice1[:] = 666         # 任何对于视图(array切片)的修改都会反映到原数组上
print(arr13)
arr13_slice2 = arr13[1:5].copy()  # copy()得到数组切片的拷贝而不是一份视图
arr13_slice2[:] = 888
print(arr13_slice2)
print(arr13)
arr14 = np.array([[1,2],[3,4]])
print(arr14[0,1])
print(arr14[0][1])

1.5 布尔索引

numpy.random.randn(d0, d1, ..., dn) 从“标准正态”分布中返回一个样本(或样本)。后边接几个参数,就是几维数组。如果没有参数,则返回从分布中随机抽样的单个float。

布尔型数组,可以用于数组索引,布尔型数组的长度必须和被索引的轴的长度一致。布尔型数组可以和切片、整数混合使用。可以使用!= 来表示“不等于”,例如“ arr15[names!='Bob',:2]”,使用&表示和,使用|表示或,例如:“ arr15[(names=='Bob')|(names == 'Lucy'),:2]”。通过布尔型数组选取数组的中数据,总是创建数据的副本。

解释: (names=='Bob').shape 的结果是 (7,); arr15.shape的结果是 (7, 5) 两者的第一个dimension都是7,所以是合法的,否则不合法。

names = np.array(['Bob','Jane','Lucy','Bob','Jim','Lucy','Bob'])
arr15 = np.random.randn(7,5)
 arr15[names == 'Bob']
 arr15[names=='Bob',:2]
 arr15[names!='Bob',:2]
 arr15[(names=='Bob')|(names == 'Lucy'),:2]
 arr15[arr15<0]=0

1.6 数组索引(已array为索引,在每个维度选择几行)

就是将一个array作为数组的索引。arr16[[4,3,0,2,1]]表示分别返回第4,3,0,2,1行并组成一个新的array(选取这些行)。其实也就是按照每个dimension选多行。

arr16 = np.arange(16).reshape(4,4)
print(arr16)
print(arr16[[0,2]])            # 选择第一行和第3行
print(arr16[[0,2]][:,[1,3]])   # 选择第1,3行,并且第2,4列

1.7 数组转置和换轴

转置操作类似于矩阵的转置(当数组是二维时),可以使用ndarray的T属性,也可以使用transpose()方法。下面介绍下transpose()方法,对于一个n维数组,原始的序列顺序是 0,1,2,...,n-1,那么输入给transpose()方法的,也是这些维度序列顺序的一个重新排列。例如三维数组原始的排序方式是0,1,2 那么arr.transpose(0,2,1) 实际上就是把第3维和第2维调整了下,第1维不变。 这种同样可以写成 arr.swapaxes(1,2)调转第2,3维。另外,np.dot(arr1,arr2) 可以实现矩阵乘法。

arr17=np.arange(15).reshape(5,3)
print(arr17)
print(arr17.T)                      # T求多维数组的转置
print(arr17.transpose(1,0))         # transpose更加灵活,可以转置多维数组。arr17有2个维度,从 0,1 -> 1,0
print( np.dot(arr17,arr17.T))       # np.dot接收2个多维数组为参数,计算矩阵乘法。
arr18 = np.arange(16).reshape(2,2,4)
print(arr18)
print(arr18.transpose(0,2,1))
print(arr18.swapaxes(1,2))          # 换轴操作,等同于arr18.transpose(0,2,1)

2. 通用函数

通用函数,也称为ufunc,是比较简单的。只要记住是在ndarray数据中进行逐元素操作的函数即可。包含一些一元函数,和二元函数。根据实际需求,可以具体查找使用。下面是一个简单的例子。

arr19 = np.random.randn(6)
print(arr19)
print(np.maximum(arr19,np.abs(arr19)))

3. 使用数组进行面向数组编程

np.meshgrid函数接收两个一维数组,并根据两个数组的所有(x,y)对生成一个二维矩阵。meshgrid的计算方法图解如下:


arr20 = np.arange(3)
arr21 = np.random.randn(5)
X,Y=np.meshgrid(arr20,arr21)
print(arr20)
print(arr21)
print(X)
print(Y)

3.1 将条件逻辑作为数组操作

使用np.where 实现 if bool_str: x else y的逻辑。

arr22 = np.random.randn(8)
print(arr22)
print(np.where(arr22>0,arr22,-arr22))

3.2 数学和统计方法

numpy提供了数学聚合函数,例如sum,mean等。mean和sum这类的函数可以接受一个axis参数,用于计算在该轴向上的统计值。

axis参数:
当axis=0时,对列进行聚合操作;
当axis=1时,对行进行聚合操作。

例如有一个ndarray,值为:
arr23 = array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
那么arr23.sum(1),是对横轴向上求和,那么第1,2,3行相加后得到3个值就是最终结果。array([10, 35, 60]) 。 同样的arr23.mean(0),是对纵轴向上求中位数,那么1,2,3,4,5列每一列分别求中位数,得到五个值最为最后结果,array([5., 6., 7., 8., 9.])。另外,cumsum求所有元素的累计和,cumprod求所有元素的累计积,计算原理都是一样的。

arr23 = np.arange(15).reshape(3,5)
print(arr23)
print(arr23.mean())
print(arr23.sum())
print(arr23.mean(0))   # 或者可以使用arr23.mean(axis = 0)
print(arr23.mean(1))
print(arr23.sum(axis=0))
print(arr23.sum(axis=1))
print(arr23.cumsum(axis=0))
print(arr23.cumprod(axis=1))

3.3 布尔型数组的方法

对于统计聚合函数,布尔型数组会被强转,True 强转为1 False强转为0 。例如:(arr24=='Bill').sum() 。 另外any用于测试数组是否存在一个或者多个True,而all则检查数组中是否所有值多为True。

arr24 = np.array(['Bill','Jane','Lucy','Bill','Bill','Jim'])
print(arr24 == 'Bill')
print((arr24=='Bill').sum())      # True 强转为1 False强转为0  那么sum结果为3
print((arr24=='Bill').any())      # 只要有一个是True那么就是True
print((arr24=='Bill').all())      # 所有是True才是True

3.4 排序和唯一化

numpy可以使用sort对多维数组的某个轴向排序。arr25.sort(axis=0)指二维数组按照行来排序,axis的参数和聚合统计的参数是一致的。np.unique(arr)可以对arr数组进行去重操作,np.in1d(values,vks)返回一个布尔数组,如果values数组中的元素在vks数组中为True,如果不在vks中则为False

arr25=np.random.randn(5,3)
arr25.sort(axis=0)               # 将二维数组按照列来排序
print(np.unique(arr24))          # arr24 = 'Bill','Jane','Lucy','Bill','Bill','Jim'
arr26 = np.array([6,9,0,0,23,2,3,1])
print(np.in1d(arr26,[2,3,6]))

3.5 线性代数

numpy.linalg包中实现了常用的用于矩阵计算的方法,例如求矩阵的逆矩阵,矩阵的行列式,计算QR分解等等(具体查看帮助)。inv方法可以求逆矩阵,np.dot在上边已有介绍求矩阵的逆,qr是进行QR计算,下边代码中arr27_mat = arr27.T.dot(arr27)是为了将arr27转化为矩阵,也就是二维array,因为array27只是列表的array并不是矩阵,需要注意。

from numpy.linalg import inv,qr
arr27=np.arange(25).reshape(5,5)
arr27_mat = arr27.T.dot(arr27)
print(arr27_mat)
print(inv(arr27_mat))
print(arr27_mat.dot(inv(arr27_mat)))
arr27_q,arr27_r = qr(arr27_mat)
print(arr27_q)
print(arr27_r)

4.随机漫步示例程序

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

推荐阅读更多精彩内容