numpy是python中用于数值计算的一个包,封装了矩阵操作、随机数生成等功能,并集成了C、C++代码的工具,在数值操作和数据科学中有很广泛的应用。numpy封装了一个新的数据类型ndarray,该对象为多维数组,并且含有常用的运算操作,方便数据处理和分析。

一、创建对象

创建ndarray对象只需要调用np.array(e)即可,e为输入的数据。从python的基本数据类型中创建:

import numpy as np
l1=[1,2,3,4,5,6]
ln1=np.array(l1)
l2=[[1,2],[3,4],[5,6]]
ln2=np.array(l2)
t=(1,2,3)
ln3=np.array(t)
ln4=np.array(6)
ln5=np.array({1:2})

其中,l1-l5分别为输入的一维列表、多维列表、元组(tuple)、整数和字典,得到的转换结果ln1-5如下:

Python之numpy的常用操作_矩阵操作

除字典不支持外,其他都转换成功。

 二、random模块

numpy自带的random模块(numpy.random)与系统random包(random)不尽相同,主要包含random、uniform、randn、normal、shuffle、seed等函数。

  • random:numpy.random.random(或rand);若输入参数为空,则随机返回一个0到1的浮点数,否则返回输入参数指定大小的0到1的随机数组,数据类型为ndarray。(random:输入为多个数的列表,rand:输入为多个参数。即random([3,4])或rand(3,4)  )
  • uniform:numpy.random.uniform;若输入参数为空,则随机返回一个0到1的浮点数,若输入参数为一个数,则返回一个不大于该参数的浮点数,若输入参数为两个数,则返回一个介于两个数之间的浮点数(大小数位置不影响),若输入参数为一个/两个列表,则返回一个与最大列表相同大小的ndarray,并且随每个机数分别小于对应位置列表的值/介于两个列表对应位置的值(两个表大小相同),若输入参数为一个数和一个表,则将数广播为和表大小相同的表,若输入参数有三个(前两个必须为数),则随机生成一个以第三个输入参数为指定大小的介于前两个数之前的ndarray。
  • randn: numpy.random.randn;随机生成符合标准正态分布的随机数,具体用法与rand相同。
  • normal:numpy.random.normal;随机生成符合正态分布的随机数,第一个参数为均值,第二个参数为方差,默认分别为0,1,可在第三个参数加入表示大小的列表来控制输出为指定大小的ndarray。
  • shuffle:numpy.random.shuffle;对输入的ndarray进行重新排列。
  • seed:numpy.random.seed;设置随机种子,每次生成固定的若干随机数。

random函数实例:

import numpy as np
a1=np.random.random()
a2=np.random.random(5)
a3=np.random.random([4,5])#或np.random.random((4,5))

结果如下:

Python之numpy的常用操作_多维数组_02

rand函数实例:

import numpy as np
a1=np.random.rand()
a2=np.random.rand(2,3)

 结果如下: 

Python之numpy的常用操作_一维数组_03

uniform函数实例:

import numpy as np
a1=np.random.uniform()
a2=np.random.uniform(3)#生成一个小于3
a3=np.random.uniform(5,6)#等同于a2=np.random.uniform(6,5)  生成一个介于5和6之间
a4=np.random.uniform([[1,2],[3,4]],[[5,6],[7,8]])#生成一个2*2,分别介于1-5,2-6,3-7,4-8
a5=np.random.uniform([1,2,3,4],5)#生成一个长度4,分别大于1、2、3、4小于5
a6=np.random.uniform(1,2,[2,3])#生成一个2*3,且每个介于1到2

 结果如下:

Python之numpy的常用操作_浮点数_04

randn、normal函数实例:

import numpy as np
a1=np.random.randn()
a2=np.random.randn(2,3)
b1=np.random.normal(10,5)
b2=np.random.normal(10,5,[2,3])

 结果如下:

Python之numpy的常用操作_随机数_05

shuffle函数实例:(shuffle无返回值)

import numpy as np 
a1=np.random.randn(2,2)
print(a1)
np.random.shuffle(a1)
print(a1)

 结果如下:

Python之numpy的常用操作_浮点数_06

(多维数组只改变第一维的顺序) 

seed函数实例:

循环四次使用同一种子随机前三个值:

import numpy as np 
for i in range(4):
    np.random.seed(123)
    print('time:'+str(i))
    a1=np.random.random()
    a2=np.random.random()
    a3=np.random.random()
    print(a1)
    print(a2)
    print(a3)

结果如下:

Python之numpy的常用操作_多维数组_07

 三、arange函数

arange函数是numpy包中用来控制生成连续指定区间,间隔相同的数的函数,格式为arange(starnt,stop,step),表示从start数开始以step步长产生数,直到大于等于stop。(stop不取)

如果输入参数为一个,则表示从0到该输入参数区间,步长为1;如果输入参数为两个,则表示从第一个输入参数到第二个输入参数区间,步长为1。如果start大于等于stop且step大于0,则返回一个长度为0的ndarray,反之同理。

arange函数实例:

import numpy as np 
a1=np.arange(6)
a2=np.arange(2,7)
a3=np.arange(2,4,0.4)
a4=np.arange(7,2,-1)

结果如下:

Python之numpy的常用操作_一维数组_08

四、矩阵操作 

大多矩阵操作和Matlab相似。

  • ones:创建全1矩阵
  • zeros:创建全0矩阵
  • eye:创建n阶单位矩阵
  • diag:创建对角矩阵
  • dot:矩阵乘
  • trace:求矩阵迹
  • det:求矩阵行列式
  • eig:求矩阵特征值和特征向量
  • inv:求矩阵的逆
  • transpose:求矩阵的转置
  • svd:svd分解
  • solve:解线性方程组
  • lstsq:计算最小二乘解

矩阵操作实例:

import numpy as np 
a1=np.zeros([3,3])
a2=np.ones([3,3])
a3=np.eye(3)
a4=np.diag([1,2,3])
a5=a3.dot(a4)#a5=a3*a4
a6=a4.trace()#a4的迹
a7=np.linalg.det(a1)#a1的行列式值
a8=np.linalg.inv(a4)#a4的逆矩阵
a9=np.transpose(a4)#a4的转置矩阵
a10=np.linalg.solve(np.random.random([3,3]),a3)#计算Ax=b 
[sol,r,rank,s]=np.linalg.lstsq(a1,a3)#计算Ax=b的最小二乘解
[value,vector]=np.linalg.eig(a5)#a5的特征值与特征向量
[U,S,V]=np.linalg.svd(a4)#a4的svd分解

结果如下:

Python之numpy的常用操作_随机数_09

五、合并,展开与广播 

在numpy中通常使用numpy.append进行合并:

一维数组中,直接使用append可对a和b按照输入参数的顺序进行合并。

import numpy as np 
a=np.array([1,2])
b=np.array([3,5])
c=np.append(a,b)

Python之numpy的常用操作_随机数_10

 但在多维数组中,若不加第三个参数,则结果变成对两个多维矩阵按行优先拉伸为一维矩阵后再进行顺序拼接:

import numpy as np 
a=np.random.random([2,3])
b=np.zeros([2,3])
c=np.append(a,b)
print(a)
print(b)
print(c)

Python之numpy的常用操作_浮点数_11

所以需要加入第三个输入参数axis,axis的值表示为按第axis-1维优先进行合并(取值0到最大维度-1)。 

import numpy as np 
a=np.random.random([2,3,4])
b=np.zeros([2,3,4])
c=np.append(a,b,0)

对上法创建的三维矩阵而言,append的第三个参数分别取0,1,2时,c的size分别为4*3*4,2*6*4和2*3*8.

 

常见的拉平函数有reshape(-1)、flatten、ravel等:

import numpy as np 
a=np.arange(24)
a=a.reshape(2,3,4)
b=a.reshape(-1)
c=a.ravel()
d=a.ravel('F')
e=a.flatten()
f=a.flatten('F')

当ravel或flatten的参数为'F'时,可以实现按列优先拉伸,结果如下:

Python之numpy的常用操作_矩阵操作_12

广播机制常用于不同维度、大小的矩阵等进行数值运算。

例如一个矩阵和一个标量操作,那么就相当于矩阵中所有元素 和标量进行操作,如果两个同样大小的矩阵相乘,那么就相当于同位置的元素相乘,或当一个多维数组加一个同列数的一维数组时,就会将一维数组复制多行,使两者大小相同。

import numpy as np 
a=np.arange(6).reshape(2,3)
b=a*2
c=a*a
d=a+np.array([[0,1,2]])

结果如下:

Python之numpy的常用操作_多维数组_13