NumPy(Numerical Python的简称)是高性能科学 和数据分析的基础包;NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。据说NumPy将Python相当于变成一种免费的更强大的MatLab系统。
其重要功能如下:
ndarray,一个具有矢量运算和复杂广播能力的快速且节省空间的多维数组。
用于对数组数据进行快速运算的标准数学函数(无需编写循环)。
线性代数、随机数生成以及傅里叶变换功能。
Numpy的安装与使用
如果我们有安装pip,直接使用pip来安装Numpy,Scipy和matplotlib即可,其中Scipy在NumPy的基础上提供了很多科学模块,MatplotLib允许你进行绘图。
pip install numpy scipy matplotlib
等待安装成功后我们即可使用Numpy,Scipy和matplotlib,如下代码导入Numpy包:
import numpy as np
数据创建函数
array将输入的(列表,元组,数组或者其他序列类型)数据转换为ndarray。要么推断出dtype,要么显示指定dtype。默认直接复制输入数据
asarry将输入转换为ndarray,如果输入本身就是一个ndarray就不进行复制,使用方法和array相同
arange 类似于内置的range, 但是返回的是一个ndarray而不是列表
ones、ones_like 根据指定的形状和dtyte创建一个全1数组。ones_like以另一个数为参数,并根据其形状和detype创建一个圈1数组
zeros、zeros_like 类似于ones、ones_like,只不过产生的是全0数据而已
empty、empty_like 创建一个新数组,只分配内存空间但不填充任何值
eye、identity 创建一个正方的N*N单位矩阵(对角线为1,其余为0)
使用实例:
import numpy as np
a = [1,3,5,7,9]
a = np.array(a)
print a
#[1 3 5 7 9]
print a.dtype
#int64
print a.shape
#(5,)
#不同于python里面列表的运算
a = a*10
print a
#[10 30 50 70 90]
a = a.astype(np.float64)
print a
#[ 10. 30. 50. 70. 90.]
print a.dtype
#float64
#ones、ones_like用法,zeros、zeros_like相同
print np.ones(5)
#[ 1. 1. 1. 1. 1.]
s = [[1,2,3],[4,5,6]]
print np.ones_like(s)
#[[1 1 1]
# [1 1 1]]
#empty、empty_like使用方法
print np.empty(5)
#[ 0. 0. 0. 0. 0.]
s = [[1,2,3],[4,5,6]]
np.empty_like(s)
#array([[ 0, 0, 4349100036],
# [4349188928, 0, 0]])
#eye、identity的用法
np.eye(5,5)
#array([[ 1., 0., 0., 0., 0.],
# [ 0., 1., 0., 0., 0.],
# [ 0., 0., 1., 0., 0.],
# [ 0., 0., 0., 1., 0.],
# [ 0., 0., 0., 0., 1.]])
np.identity(3)
#array([[ 1., 0., 0.],
# [ 0., 1., 0.],
# [ 0., 0., 1.]])
元素级数组函数
一元ufunc:
abs、fabs 计算整数、浮点数或复数的绝对值。对于非复数,可以使用更快的fabs
sqrt 计算各元素的平方根。相当于arr**0.5
square 计算各元素的平方。相当于arr**2
exp 计算个元素的指数e^x
log、log10、log2、log1p 分别为自然对数(底数为e)、底数为10、底数为2、log(1+x)
sign 计算各元素的正负号, 输出的为1,0,-1代表:1(正数)、0(零)、-1(负数)
ceil 计算各原属的ceilling值,即大于等于该值的最小整数
floor 计算各元素的floor值,即小于等于该值的最大整数
rint 将各元素的值四舍五入为接近的整数,保留dtype
modf 将数组的小数和整数部分以2各独立的数组形式返回
isnan 返回一个表示"那些值是NAN"的布尔整数组
isfinite、isinf 返回一个表示"那些元素师有穷的(非NAN)"或"哪些元素是无穷的"的布尔整数组
cos、cosh、sin、sinh、tan、tanh 普通型和双曲线型三角函数
arccos、arcosh、arcsin、arcsinh、arctan、arctanh 反三角函数
logical_not 计算各元素not x的真值。相当于-arr
上面所有函数的使用方法均相同,没有特殊性,所以不一一列举,使用实例:
# sqrt使用实例
a = np.arange(10)
print a
# [0 1 2 3 4 5 6 7 8 9]
print np.sign(a)
# 输出:[0, 1, 1, 1, 1, 1, 1, 1, 1, 1],1表示正数、0代表为零、-1表示负数
二元ufunc:
add 将素组中的对应元素相加
subtract 从第一个数组中减去第二个数组中的元素
muitiply 数组元素相乘
divide、floor_divide 除法或向下圆整除法(丢弃余数)
power 对第一个数组总的元素A,根据第二个数组中的相应元素B,计算A^B
maximum、fmax 元素级的最小大值计算。fmax将忽略NaN
mod 元素级的求模计算(除法的余数)
copysign 将第二个数组中的值的符号复制给第一个数组中的值
greater、greater_equal、less、less_equal、equal、less_equal、equal、not_equal 执行元素的比较运算,最终产生布尔型数组。相当于中缀运算符>、>=、
logical_and、logical_or、logical_xor 执行元素级的真值逻辑运算。相当于中缀运算符&、|、^
x = np.random.randn(8)
y = np.random.randn(8)
print x
print y
print np.add(x,y)
#输出
[ 2.22162794 0.20938865 -0.25770183 1.14488958 -1.47362583 -0.536403 0.54836918 1.5451774 ]
[-1.83212425 1.805915 1.02510319 -0.53042174 0.35915362 -0.71709233 0.49667371 0.06864708]
[ 0.38950369, 2.01530365, 0.76740136, 0.61446784, -1.11447221, -1.25349533, 1.04504289, 1.61382448]
基本数组统计方法
sum 对数组中全部或某轴向的元素求和。零长度的数组的sum为0
mean 算术平均数。零长度的数组的mean为NaN
std、var 分别为标准差和方差,自由度可调(默认为n)
min、max 最大值和最小值
argmin、argmax 分别为最大和最小元素的索引
cumsum 所有元素的累计和
cumprod 所有元素的累计积
使用实例:
x = np.random.randint(1,5,5)
print x
# 输出[2 3 3 2 4]
print np.cumsum(x)
# 输出[ 2 5 8 10 14]
数据的集合运算
unique 计算x中的唯一元素,并返回有序结果
intersect1d(x,y) 计算x和y中的公共元素,并返回有序结果
union1d(x,y) 计算x和y的并集,并返回有序结果
in1d(x,y) 得到一个表示"x的元素是否包含于y"的布尔型数组
setdiff1d(x,y) 集合的差集,即元素在x中并不在y中
setxor1d(x,y) 集合的对称差,即存在于一个数组中但不同时存在于两个数组中的元素
a = np.random.randint(1,6,5)
print a
# 输出[5, 4, 4, 2, 2]
print np.unique(a)
# 输出[2, 4, 5]
# 计算x和y的并集
x = np.random.randint(1,5,5)
y = np.random.randint(1,6,5)
print x
# 输出[2 4 3 3 1]
print y
# 输出[3 1 1 3 4]
print np.union1d(x,y)
# 输出[1, 2, 3, 4]
常用的numpy.linalg函数
diag 以一位数组的形式返回方阵的对角线(或非对角线)元素,或将一位数组转换为方阵(非对角线元素为0)
dot 矩阵乘法
trace 计算对角线元素的和
det 计算矩阵行列式
eig 计算方阵的本征值和本征向量
inv 计算方阵的逆
pinv 计算矩阵的Moore-Penrose伪逆
qr 计算QR分解
svd 计算奇艺值分解(SVD)
solve 解线性方程组Ax=b,其中A为一个方阵
lstsq 计算Ax=b的最小乘解
a = np.random.rand(3,3)
print a
# [[ 0.95506305 0.77311157 0.44264429]
# [ 0.31639102 0.87878477 0.96184546]
# [ 0.72315137 0.77126853 0.71526998]]
print np.diag(a)
# 输出:[ 0.95506305, 0.87878477, 0.71526998]
print np.trace(a)
# 2.54911780047
# 我们这里还是所有刚才的例子来计算矩阵乘法
x = np.random.randint(1,5,5)
y = np.random.randint(1,6,5)
print x
# 输出[2 4 3 3 1]
print y
# 输出[3 1 1 3 4]
print np.dot(x,y)
# 输出26,相当于2*3+4*1+3*1+3*3+1*4
部分numpy.random函数
seed 确定随机数生成器的种子
permutation 返回一个序列的随机排列或者返回一个随机列的范围
shuffle 对一个序列就地随机排列
rand 产生均匀分布的样本值
randint 从给定的上下限范围内随机选取整数
randn 产生正态分布(平均值为0,标准差为1)的样本值,类似于MATLAB接口
binomial 产生二项分布的样本值
normal 产生正态(高斯)分布的样本值
beta 产生Beta分布的样本值
chisquare 产生卡方分布的样本值
gamma 产生Gamma分布的样本值
uniform 产生(0,1)中均匀分布的样本值
# 使用方法都是大同小异,接下来我们来看一看
# 生产一个3行3列的随机矩阵
print np.random.rand(3,3)
# 在3到5中选择成为一行三列的矩阵
print np.random.randint(3,5,3)
数组连接函数
concatenate 最一般化的链接,沿一条轴连接一组数组
vstack、row_stack 以面向行的方式对数组进行堆叠(沿轴0)
hstack 以面向行的方式对数组进行堆叠(沿轴1)
column_stack 类似于hstack, 但是会先将一维数组转换为二维列向量
dstack 以面向"深度"的方式对数组进行堆叠(沿轴2)
split 沿指定轴在指定的位置拆分数组
hsplit、vsplit、dsplit split的便捷化函数,分别沿轴0,轴1,轴2进行拆分
# 生产一个3行3列的随机矩阵
b = np.random.rand(3,3)
print b
# [[ 0.0313988 , 0.6232195 , 0.05890425],
# [ 0.96634376, 0.30205009, 0.7556322 ],
# [ 0.53313903, 0.22614023, 0.03904029]]
print np.concatenate(b)
# [ 0.0313988 , 0.6232195 , 0.05890425, 0.96634376, 0.30205009, 0.7556322 , 0.53313903, 0.22614023, 0.03904029]
take、where、copy的用法
1、take:
arr = np.arange(10)*100
inds = [7,1,2,6]
print arr.take(inds) #[700 100 200 600]
2、where:
numpy.where函数是三元表达式x if condition else y的矢量化版本。
arr = np.random.randn(4,4)
print arr
[[-1.49198141 1.7730161 0.26431341 0.56486885]
[ 1.35869064 -0.72590907 0.85217981 1.63125357]
[ 0.03978439 -1.14930575 -0.04916222 0.58884003]
[-0.80573536 0.06746035 -1.12376692 0.94245017]]
print np.where(arr < 0, 0, arr)
[[ 0. 1.7730161 0.26431341 0.56486885]
[ 1.35869064 0. 0.85217981 1.63125357]
[ 0.03978439 0. 0. 0.58884003]
[ 0. 0.06746035 0. 0.94245017]]
3、copy:
data_copy = data.copy()
# 可以得到一份副本,并不影响原来的数据
NumPy安装使用与详细解读,轻松学会NumPy框架-NumPy中文文档 - pytorch中文网
原文出处: https://ptorch.com/news/33.html
问题交流群 :168117787