学习笔记

Python Numpy模块

Numpy是Python的一个高性能矩阵运算的科学计算库。它的主要用途是以数组的形式进行数据操作和数学运算,数据分析、机器学习大都是进行数学计算。

Numpy提供多维数组对象以及蒙版数组和矩阵等各种派生对象,用于对数组进行快速便捷的操作,包括数学、逻辑、形状处理、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等,Numpy是数据科学中必不可少的工具。

由于Numpy对数据进行量化描述,没有任何显式的循环操作,所以执行速度更快,代码更简洁优雅,出错率更低。

Numpy提供了两个基本的对象:

ndarray:存储数据的多维数组

ufunc:对数据进行处理的函数

1.数据结构

Numpy的ndarray提供了一维到三维的数据结构,下图所示为同构数据多维容器,所有元素必须是相同类型,我们经常用到的是一维和二维数组。

Numpy的数据结构图示:

Numpy的数据结构图示

ndarray对数据向量化,利用隐式逐元素的方式广播机制进行算术运算、逻辑运算、位运算、函数调用等,可以快速、批量地处理数据。

2.创建数据

使用Numpy需要先导入,约定俗成地为它起别名np。

使用np.array可传入一个元组或列表,如果是二维数据,可以使由列表组成的列表或由元组组成的列表等形式。

import numpy as np

np.array([1,2,3])
np.array((1,2,3))
#返回结果都是[1 2 3]

np.array(((1,2),(1,2)))
np.array(([1,2],[1,2]))
np.array([[1,2],[1,2]])
'''返回结果都是:
[[1 2]
 [1 2]]'''

以下是一些常见的数据生成函数:

import numpy as np

np.array([1,2,3])
np.array((1,2,3))
#返回结果都是[1 2 3]

np.array(((1,2),(1,2)))
np.array(([1,2],[1,2]))
np.array([[1,2],[1,2]])
'''返回结果都是:
[[1 2]
 [1 2]]'''


s=np.arange(10)    #生成10个数字,默认步长为1,,[0 1 2 3 4 5 6 7 8 9]
s=np.arange(3,7,0.1)   #生成从3到7(不包含7),步长为0.1的序列数字
'''
[3.  3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.  4.1 4.2 4.3 4.4 4.5 4.6 4.7
 4.8 4.9 5.  5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6.  6.1 6.2 6.3 6.4 6.5
 6.6 6.7 6.8 6.9]'''

s=np.linspace(2.0,3.0,num=5,endpoint=False) #从2到3(不包含3)生成均匀的5个值,每个值之间的间隔一样
#[2.  2.2 2.4 2.6 2.8]
#从起始数到终点数,平均分成几段,每个值都是每段的起点:
s=np.linspace(0,100,num=3,endpoint=False)
#[ 0.         33.33333333 66.66666667]

s=np.linspace(0,60,num=3,endpoint=True)
#如果endpoint参数为True,则返回结果一定包含最终值
#[ 0. 30. 60.]

s=np.random.randn(6,2)  #生成6*2的随机数组
'''
[[ 0.9412104  -1.3360841 ]
 [-2.50008964  0.0978346 ]
 [ 0.95271129  0.19416987]
 [ 1.1880049   0.31011929]
 [-0.66638336  0.99938753]
 [-0.53039672 -0.6286474 ]]'''

s=np.random.randint(10,100,size=(2,3))     #生成指定返回,指定形状的随机数组,这里10,100是取值范围,size是形状,2行3列
'''
[[30 60 23]
 [55 81 94]]'''

#创建值为0的数组
s=np.zeros(6)   #[0. 0. 0. 0. 0. 0.]    #生成6个浮点0
s=np.zeros(6,dtype=int)     #[0 0 0 0 0 0]  6个0均为整数
s=np.zeros(6,dtype='int')     #[0 0 0 0 0 0]  6个0均为整数
'''
[[0 0 0]
 [0 0 0]]'''

s=np.ones(3)    #[1. 1. 1.] #生成指定个数的浮点1
s=np.empty(3)   #[0. 0. 0.]

#创建一份和目标结构相同的0值数组
s=np.zeros_like(np.arange(6))   #[0 0 0 0 0 0]
s=np.ones_like(np.arange(6))    #[1 1 1 1 1 1]
s=np.empty_like(np.arange(7))   #[2 2 0 0 0 0 0]    返回数据很随机


#np.empty()的作用是根据给定的shape和数据类型dtype,返回一个一维或者多维数组,数组的元素不为空,为随机产生的数据
#np.empty(shape,dtype,order)
#shape也就是形状,表示几行几列,比如(2,3)表示2行3列
#dtype数据类型是个可选项,定义返回数组的类型,比如dype=int或者float
#order:{'C','F'},此参数定义将多维数组存储在主要行或列主要行中的顺序。默认情况下,order参数设置为'C'。规定返回数组元素在内存的存储顺序,可选项。C - rowmajor ; F - columnmajor

#返回一个2x3的浮点数
s=np.empty([2,6],dtype=float,order='F')
'''
[[ 0.09444973  1.22802151 -0.12339779  2.77733152 -0.17654593  0.77310039]
 [ 1.00365908 -2.04439778 -0.32148906 -1.28286932 -1.17040337  0.42034716]]'''


print(s)

3.数据类型

np.int64 #有符号64位整形
np.float32 #标准双精度浮点类型
np.complex #由128位的浮点数组成的复数类型
np.bool #bool类型(True或False)
np.object #Python中的object类型
np.string #固定长度的string类型
np.unicode #固定长度的unicode类型
np.NaN #no.float的子类型
np.nan

4.数组信息

一些获取数组信息的常用方法:

n.shape() # 数组的形状,返回值是一个元组
n.shape = (4, 1) # 改变形状
a = n.reshape((2,2)) # 改变原数组的形状,创建一个新数组
n.dtype # 数据类型
n.ndim # 维度数
n.size # 元素数
np.typeDict # np的所有数据类型

5.统计计算

两个数组间的操作采用行列式的运算规则,示例:

np.array([10, 20, 30, 40])[:3] # 支持类似列表的切片
a = np.array([10, 20, 30, 40])
b = np.array([1, 2, 3, 4])
a+b # array([11, 22, 33, 44])(矩阵相加)
a-1 # array([9, 19, 29, 39])
4*np.sin(a)

# 以下是一些数学函数的例子,还支持非常多的数学函数
a.max() # 40
a.min() # 10
a.sum() # 100
a.std() # 11.180339887498949
a.all() # True
a.cumsum() # array([10, 30, 60, 100])
b.sum(axis=1) # 多维可以指定方向

var()	方差
mean()	求平均数
argmax()	最大值的下标(索引)
argmin()	最小值的下标(索引)

6.其他操作

对数组中的数据按照条件筛选:

s=np.arange(10)
print(s) #[0 1 2 3 4 5 6 7 8 9]
print(s[s>6]) #[7 8 9]

#多重条件筛选,取数组内大于6的偶数
s=np.arange(10)
print(s)    #[0 1 2 3 4 5 6 7 8 9]
print(s[(s>6)&(s%2==0)]) #[8]

#在二维数组中:
数组[0,0:3]	#选择数组的第0行,索引值0到2的元素
数组[0,数组[0]>2]	#选择数组中处于第0行,并且大于2的元素

#选取不同行但相同索引值的元素
数组[[1,3],:][:,[2,3]]	#选取第一行与第三行,索引值为2与3的元素
#先筛选出第一行与第三行的所有元素,再从筛选出的元素中,选择所有行以及索引值是2与3的元素

Numpy通用函数:

能同时对数组中所有元素进行运算的函数

一元函数:abs

sqrt(开方)

exp

log

ceil(向上取整)

floor(向下取整)

round(四舍五入)

rint

trunc(截断浮点值,返回整数部分)

modf(将一个数组拆分成2个数组,第一个数组是原数组的小数部分,第二个数组是原数组的整数部分)

可以x,y=np.modf(数组)#将小数部分返回给X,整数部分返回给y

isnan

isinf

cos

sin

tan

二元函数:add,substract,multiply,divide,power,mod,maximum(取2个数组中对应位置的最大值生成新的数组),mininum

浮点数特殊值:
nan (not a number) 不等于任何浮点数
inf (infinity) 比任何浮点数都大
Numpy中创建特殊值:np.nan np.inf
在数据分析中,nan常被用作表示数据缺失值
判断np.nan==np.nan会返回False
判断np.nan is np.nan会返回True

假如数组中存在nan,判断np.nan in 数组会返回False
np.isnan(数组) #判断数组中所有的值是否为nan,是nan则会在对应元素的位置返回True

0被当成除数,会返回inf(无限大)
移除数组中的inf:
数组[数组!=np.inf] 或者 数组[~np.isinf(数组)] #~表示取反

Numpy随机数:

np.random.randint(起始值,最终值,数量/形状(可选))

#返回起始值至最终值(不包含最终值)范围内的随机数,默认返回1个随机数,

如果假如第三个参数,也就是数量/形状,可以设置返回的数量或者几行几列,形状要用括号()表示,比如(2,3)表示2行3列,如果形状中有3个参数,比如(2,3,3)那就会创造三维随机数组

s=np.random.randint(1,2) #1

s=np.random.randint(1,2,3) #[1 1 1]

s=np.random.randint(1,2,(2,3))

”’

[[1 1 1]

[1 1 1]]”’

np.random.rand(数量) #返回0到1之间的浮点数,默认返回1个

数组=np.random.randint(1,10,3) #[1 1 1]

s=np.random.choice(数组) #从数组中随机选择一个数

print(s)

随机打乱数组内的排序:

import random

数组=np.random.randint(1,10,10) #[1 1 1]

random.shuffle(数组)

print(数组) #[6 7 8 1 9 4 5 6 9 3]

np.random.uniform(起始值,最终值,个数(可选)) #给定形状产生随机数组 从起始值与最终值之间,按均匀分布取值,然后随机采样?

1 thought on “Python Numpy模块”

发表回复