NumPy安装使用与详细解读,轻松学会NumPy框架-NumPy中文文档

Song • 3822 次浏览 • 0 个回复 • 2017年08月06日

NumPy(Numerical Python的简称)是高性能科学 和数据分析的基础包;NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。据说NumPy将Python相当于变成一种免费的更强大的MatLab系统。

其重要功能如下:

  1. ndarray,一个具有矢量运算和复杂广播能力的快速且节省空间的多维数组。
  2. 用于对数组数据进行快速运算的标准数学函数(无需编写循环)。
  3. 线性代数、随机数生成以及傅里叶变换功能。

Numpy的安装与使用

如果我们有安装pip,直接使用pip来安装NumpyScipymatplotlib即可,其中ScipyNumPy的基础上提供了很多科学模块,MatplotLib允许你进行绘图。

pip install numpy scipy matplotlib

等待安装成功后我们即可使用NumpyScipymatplotlib,如下代码导入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数据而已
  • emptyempty_like 创建一个新数组,只分配内存空间但不填充任何值
  • eyeidentity 创建一个正方的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 算术平均数。零长度的数组的meanNaN
  • 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框架-NumPy中文文档 - pytorch中文网
原文出处: https://ptorch.com/news/33.html
问题交流群 :168117787
提交评论
要回复文章请先登录注册
用户评论
  • 没有评论
Pytorch是什么?关于Pytorch! Pytorch v0.2版本发布--高阶梯度,分布式PyTorch,广播,高级索引,新图层等