Numpy数值计算

Numpy多维数组

Numpy提供了一个名为ndarray的多维数组对象,该数组元素具有固定大小,即Numpy数组元素是同质的,只能存放同一种数据类型的对象,因此能够确定存储数组所需空间的大小,能够运用向量化运算来处理整个数组,具有较高的运算效率。

数组创建

可以通过多种方法创建Numpy数组

1.通过array()函数创建ndarray数组
  • Numpy的array()函数可以创建ndarray数组,对于多维数组的创建、使用嵌套序列数据即可完成。array()函数可以将Python的列表、元组、数组或其他序列类型作为参数创建ndarray数组。

①一维列表作为array参数:

1
2
3
import numpy as np
a1 = np.array([1,2,3,4,5,6])
print(a1)

②二维列表作为array参数:

1
2
3
import numpy as np
a2 = np.array([[1,2,3],[4,5,6]])
print(a2)

③字符串作为array参数:

1
2
3
import numpy as np
a3 = np.array('abcdefg')
a3

④元组作为array参数:

1
2
3
import numpy as np
a4 = np.array((1,2,3))
a4

⑤字典作为array参数:

1
2
3
import numpy as np
a5 = np.array({'zhang':12,'dd':45})
a5

2.创建特殊数组
  • Numpy提供了创建特殊数组的函数,如表所示

    函数 描述
    ones() 创建指定长度或形状的全1数组
    ones_like() 以另一个数组为参考,根据其形状和dtype创建全1数组
    zeros\zeros_like() 类似于ones/ones_like,创建全零数组
    empty\empty_like() 同上,创建没有具体值的数组
    eye\identity() 创建正方形的N*N单位矩阵

    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import numpy as np
    b1 = np.empty((2,3))
    print('b1=')
    print(b1)
    b2 = np.zeros((3,5))
    print('b2=')
    print(b2)
    b3 = np.ones((4,2))
    print('b3=')
    print(b3)
    b4 = np.eye(3)
    print('b4=')
    print(b4)
    b5 = np.ones_like(b1)
    print('b2=')
    print(b5)

    输出结果:

3.从数值范围创建数组

从数值范围创建数组的Numpy函数有三个:arange()\linspace()和logspace()。

    1. arange()函数:

    函数arange()根据start指定的范围以及step设置的步长,生成一个ndarry对象,函数格式如下:

    1
    numpy.arange(start,stop,step,dtype)

    其中的参数如表所示:

    参数 描述
    start 起始值,默认为0
    stop 终止值(不包含)
    step 步长,默认为1
    dtype 返回的ndarray的数据类型,如果没有提供,则会使用输入数据的类型
    1. linspace()函数

    Linspace()函数用于创建一个一维数组,数组是一个等差数列构成的,其格式如下:

    1
    np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)

    其中参数如表所示

    参数 描述
    start 起始值,默认为0
    stop 序列的终止值,如果endpoint为True,该值包含于数列中
    num 要生成的等步长的样本数量,默认为50
    dtype ndarray的数据类型
    endpoint 该值为True时,数列中包含stop值,反之不包含,默认为True
    retstep 如果为True,生成的数组中会显示间距,反之不显示
    1. logspace()函数

      logspace()函数用于创建一个对数运算的等比数列,其格式如下:

      1
      np.logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None)
      参数 描述
      start 起始值,默认为0
      stop 序列的终止值,如果endpoint为True,该值包含于数列中
      num 要生成的等步长的样本数量,默认为50
      dtype ndarray的数据类型
      endpoint 该值为True时,数列中包含stop值,反之不包含,默认为True
      base 对数log的底数

      实例:从数值范围创建数组

      1
      2
      3
      4
      5
      6
      7
      import numpy as np
      c1 = np.arange(10)
      c2 = np.linspace(1,10,10)
      c3 = np.logspace(10,100,10)
      print('c1=',c1)
      print('c2=',c2)
      print('c3=',c3)

4.使用asarray()函数创建Numpy数组

函数asarray()把Python的列表、元组等转换为Numpy数组,其格式如下:

1
numpy.asarray(a,dtype=None,order=None)

其中参数如表所示:

参数 描述
a 任意形式的输入参数,可以是列表、列表的元组、元组、元组的元组、元组的列表、多维数组
dtype 数据类型(可选)
order 可选,有C和F两个选项,分别代表行优先和列优先

示例:asarray()函数的应用

1
2
3
4
import numpy as np
d1 = [1,3,5,7,9]
d2 = np.asarray(d1)
print(d2)

5.随机数数组

通过Numpy的随机函数可以创建随机数数数组,在numpy.random模块中,提供了多种随机生成函数,如表所示。

参数 描述
rand() 产生均匀分布的样本值
randint() 给定范围内取随机整数
randn() 产生正态分布的样本值
seed() 随机数种子
permutation() 对一个序列随机排序,不改变原数组
shuffle() 对一个序列随机排序,改变原数组
uniform(low,high,size) 产生具有均匀分布的数组,low表示起始值,high表示结束值,size表示形状
normal(loc,scale,size) 产生具有正态分布的数组,loc表示均值,scale表示标准差
poisson(lam,size) 产生具有泊松分布的数组,lam表示随机事件发生率
  • rand()函数

    rand()函数产生一个指定形状的数组,数组中的值服从[0,1)之间的均匀分布,其格式如下:

    1
    numpy.random.rand(d0,d1,...,dn)

    其中,参数d0,d1,…,dn为int型,可选。如果没有参数则返回一个float型的随机数。该随机数服从[0,1]之间的均匀分布。其返回值是一个ndarray对象或者一个float型的值。

    示例:rand()函数的应用

    1
    2
    3
    import numpy as np
    a = np.random.rand(2,4)
    print(a)

  • uniform()函数

    uniform()函数返回一个在区间[low,high)中均匀分布的数组,其格式如下:

    1
    uniform(low=0.0,high=1.0,size=None)

    其中,参数low、high是float型或者float型的类数组对象。指定抽样区间为[low,high),low的默认值为0.0,high的默认值为1.0;size是int型或int型元组。指定形状,如果不提供size,则返回一个服从该分布的随机值。

    这个读起来比较抽象,我们拿具体示例来看:

    1
    2
    3
    4
    5
    import numpy as np
    a = np.random.uniform(size=(2,4))//二行四列
    b = np.random.uniform(3,5,(2,4))//二行四列
    print(a)
    print(b)

  • randn()函数

    函数randn()返回一个指定形状的数组,数组中的值服从标准正态分布(均值为0,方差为1),其格式如下:

    1
    numpy.random.randn(d0,d1,...,dn)

    其中,参数d0,d1,…,dn为int型,可选。如果没有参数,则返回一个服从标准正态分布的float型随机数。

    返回值:ndarray对象或者float

    示例:randn()函数的应用

    1
    2
    3
    import numpy as np
    a = np.random.randn(2,4)
    print(a)

  • normal()函数

    normal()函数生成一个由size指定形状的数组,数组中的值服从μ=loc,σ=scale的正态分布,其格式如下:

    1
    numpy.random.normal(loc=0.0,scale=1.0,size=None)

    函数参数说明如下:

    ①loc:float型或者float型的类数组对象,指定均值

    ②scale:float型或者float型的类数组对象,指定标准差

    ③size:int型或者int型类元组,指定了数组的形状。如果不提供size,则loc和scale为标量(不是类数组对象),则返回一个服从该分布的随机数。

    输出:ndarray对象或者一个标量

    示例:normal()函数的应用

    1
    2
    3
    import numpy as np
    a = np.random.normal(size=(2,4)) //24
    print(a)

  • randint()函数

    randint()函数生成一个在区间[low,high)中离散均匀抽样的数组,其格式如下:

    1
    numpy.random.randint(low,high=None,size=None,dtype='1')

    函数参数说明如下:

    ①low、high:int型,指定抽样区间[low,high)

    ②size:int型或int型元组,指定形状

    ③dtype:可选参数,指定数据类型,如int、int64等,默认为np.int

    返回值:如果指定了size,则返回一个int型的ndarray对象,否则返回一个服从该分布的int型随机数。

    示例:randint()函数的应用

    1
    2
    3
    import numpy as np
    a = np.random.randint(1,10,size=(2,4))
    print(a)

  • numpy.random.random(size=None)

    函数random()生成[0,1)之间均匀抽样的数组,其格式如下:

    1
    numpy.random.random(size=None)

    参数size:int型或者int型的元组,如果不提供则返回一个服从该分布的随机数

    返回值:float型或者float型的ndarray对象

    示例:random()函数的应用

    1
    2
    3
    import numpy as np
    a = np.random.random((2,4))
    print(a)

6.数组对象属性

ndarray对象具有多个十分有用的属性,如表所示。

属性 描述
ndim 秩,即数据轴的个数
shape 数组的维度
size 元素的总个数
dtype 数据类型
itemsize 数组中每个元素的字节大小
nbytes 存储在数组所需的字节数量,是itemsize属性值和size属性值之积
T 数组的转量
flat 返回一个numpy.flatiter对象,可以使用flat的迭代器来遍历数组

①属性T。如果数组的秩小于2,那么所得只是一个数组的视图

②属性flat提供了一种遍历方式,同时还可以给flat属性赋值,但是赋值会覆盖整个数组内所有元素的值。

示例:random()函数的应用

1
2
3
4
5
6
7
8
9
10
import numpy as np
a = np.array([np.arange(3),np.linspace(3,5,3)])
print(np.arange(5).T) #一维数组的转置为自身视图
print('a=')
print(a)
print(a.ndim,a.shape,a.size,a.dtype,a.itemsize,a.nbytes)
print('数组转置')
print(a.T)
for item in a.flat:
print(item,end=',')

7.数组数据类型

Python虽然支持整型、浮点型和复数型,但对于科学计算来说,仍然需要更多的数据类型来满足在精度和存储大小方面的各种不同要求。NumPy提供了丰富的数据类型,如表所示。

类型 描述
bool 布尔型(值为True或False),占用1bit
inti 其长度取决于平台的整数(通常为int32或者int64)
int8 字节类型(取值范围为-128~127)
int16 整型(取值范围为-32768~32767)
int32 整型(取值范围为-2^31~2^31-1)
int64 整型(取值范围为-2^63~2^63-1)
uint8 无符号整型(取值范围为0~655)
uint16 无符号整型(取值范围为0~65535)
类型 描述
uint32 无符号整型(取值范围为0~2^32-1)
uint64 无符号整型(取值范围为0~2^64-1)
float16 半精度浮点型:符号占用1bit,指数占用5bit,尾数占用10bit
float32 单精度浮点型:符号占用1bit,指数占用8bit,尾数占用23bit
float64或者float 双精度浮点型:符号占用1bit,指数占用11bit,尾数占用52bit
complex64 复数类型,由两个32位浮点型(实部和虚部)表示
complex128或者complex 复数类型,由两个64位浮点数(实部和虚部)表示

备注:数据类型的名称以数字结尾,表示该类型的变量所占用的二进制位数

    1. dtype指定数据类型

      创建数组时,如果没有指定数组类型,numpy会给新建的数组一个合适的数据类型。当然,也可以给创建的数组指明数据类型,指明数据类型是通过参数dtype实现的

    2. astype转换数据类型

      astype()函数可以把数组元素转换成指定类型

注意:

  • 指定类型有两种写法。以float64为例:np.float64和”float64”,这两种方式效果相同
  • 将浮点数转化成整数时元素的小数部分被截断,而不是四舍五入
  • 数值型的字符串可以通过astype方法将其转换为数值类型,但如果字符串中有非数值型进行转换就会报错
  • astype方法会创建一个新的数组,并不会改变原有数组的数据类型

示例:astype()函数的应用

1
2
3
4
5
6
7
8
9
import numpy as np
a = np.array([[1.1,2.2],[3.3,3.4]],dtype=np.float)
b = a.astype(np.int)
print('a=',a)
print('b=',b)
c = np.arange(5,dtype=np.int8)
print('c.dtype=',c.dtype)
print('数据类型转换后的dtype=',c.astype(np.float).dtype)
print('c的数据类型没有改变,c.dtype=',c.dtype)