Numpy

  1. Numpy
    1. Numpy简介
    2. N维数组-ndarray
    3. 基本操作
    4. ndarray运算
    5. ndarray间的运算

Numpy

Numpy简介

Numpy是开源的Python科学计算库,用于快速处理任意维度的数组。

Numpy支持常见的数组和矩阵操作。对于同样的数值的计算任务,使用Numpy比直接使用Python要简洁的多。

Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

  • ndarray的优势
    • 内存块风格:ndarray在存储数据时是连续存储的,不像python的list先得寻址再找数据
    • ndarray支持并行化运算:Numpy底层使用C语言编写,内部杰出了GIL锁,器对数组得操作速度不受python解释器的限制。

N维数组-ndarray

  • 生成ndarray方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 按照输入的列表生成一个数组
np1 = np.array([[1,2,3],[4,5,6]])
# 生成全为0的3行4列的数组
np1 = np.zeros([3,4])
# 生成全为1的3行4列的数组
np1 = np.ones([3,4])
# 依照现有数组的形状生成一个新的全为0的数组
np2 = np.ones_like(np1)
# 依照现有数组的形状生成一个新的全为1的数组
np3 = np.zeros_like(np2)
# 生成一个固定范围内的等间隔数组值0开始,5结束,6个元素,包含结束值(默认为true包含)
np3 = np.linspace(0,5,6,true) # array([0.,1.,2.,3.,4.,5.])
# 生成一个固定步长的等间隔数组值0开始,5结束,步长为1
np3 = np.arange(0,5,1) # array([0,1,2,3,4])
# 生成一个均匀分布的[0,1)3行4列的数组
np3 = np.random.rand(3,4)
# 生成一个[0,1)之间均匀分布的大小为10小数数组
np3 = np.random.uniform(low=0.0,high=1.0,size=10)
# 生成一个[0,10)之间均匀分布大小为10的整数数组
np3 = np.random.ranint(10,size=10)
# 生成一个[1,10)之间均匀分布大小为10的整数数组
np3 = np.random.ranint(1,high=10,size=10)
# 生成一个标准正太分布的3行4列的数组
np4 = np.random.randn(3,4)

  • ndarray的属性
1
2
3
4
5
6
7
8
9
10
11
import numpy as np
# 创建数组
np1 = np.array([[1,2,3],[4,5,6]])
# 获取数组形状(2,3)
np1.shape
# 获取数组的类型 numpy.int64,也可以创建的时候定义np.array([[1,2,3],[4,5,6]],dtype=np.float32)
np1.dtype
# 获取数组的维度 2
np1.ndim
# 获取数组中元素数量 6
np1.size
名称 描述 简写
np.bool 用一个字节存储的布尔类型(True或False) ‘b’
np.int8 一个字节大小,-128 至 127 ‘i’
np.int16 整数,-32768 至 32767 ‘i2’
np.int32 整数,-2 31 至 2 32 -1 ‘i4’
np.int64 整数,-2 63 至 2 63 - 1 ‘i8’
np.uint8 无符号整数,0 至 255 ‘u’
np.uint16 无符号整数,0 至 65535 ‘u2’
np.uint32 无符号整数,0 至 2 ** 32 - 1 ‘u4’
np.uint64 无符号整数,0 至 2 ** 64 - 1 ‘u8’
np.float16 半精度浮点数:16位,正负号1位,指数5位,精度10位 ‘f2’
np.float32 单精度浮点数:32位,正负号1位,指数8位,精度23位 ‘f4’
np.float64 双精度浮点数:64位,正负号1位,指数11位,精度52位 ‘f8’
np.complex64 复数,分别用两个32位浮点数表示实部和虚部 ‘c8’
np.complex128 复数,分别用两个64位浮点数表示实部和虚部 ‘c16’
np.object_ python对象 ‘O’
np.string_ 字符串 ‘S’
np.unicode_ unicode类型 ‘U’

基本操作

  • 索引切片

    • 索引:直接由外到内依次进行索引(用”,”隔开)[num,num,…]

    • 切片:和python一样也是由外到内进行切片[num:num,num:num,…]

    • 花式索引:array[[num1,num2,…]],返回一个array第num1个元素,第num2个…..,组成的array

      ​ array[[num1,num2,…], [num3,num4,…]] 返回一个array第num1行的第num3的元素,第num2行的第num4个元素

  • 形状改变

    • ndarray.reshape(shape, order):返回一个具有相同数据域,但是shape不一样的array(装换前元素个数个转换后的个数必须一样)
    1
    2
    3
    np1 = np.array([[1,2,3],[4,5,6]])
    np2 = np1.reshape([3,2]) # array([[1,2],[3,4],[5,6]])
    np2 = np1.reshape([-1,2]) # -1 表示待计算,只有np1元素总个数能够整除2就行
    • ndarray.resize(shape):在array原本的基础上进行修改,不返回新的元素
    1
    2
    np1 = np.array([[1,2,3],[4,5,6]])
    np1.resize([3,2])
    • ndarray.transpose():对数组进行转置,返回新的数组(可以指定轴进行转换)
    • ndarray.T:对数组进行转置,返回新的数组
    1
    np1.T
  • 类型改变

    • ndarray.astype(type):返回新的改变类型后的数组
    1
    np2 = np1.astype(np.float)
    • ndarray.tostring()或ndarray.tobytes():把数组转换成base64的字符串
  • 数组取重

    • np.unique(array):把数组拉平然后返回一个拉平后的去重数组
    1
    2
    np1 = np.array([[1,2,3,4],[3,4,5,6]])
    np2 = np.unique(np1) # array([1,2,3,4,5,6])

    ndarray运算

  • 逻辑运算

    1
    2
    3
    4
    np1 = np.array([[1,2,3,4],[3,4,5,6]])
    np1>3 # 返回一个相同形状的True和Flase的矩阵,大于3的为True,否则为Flase

    np1[np1>3]=0 # 把是所有大于3的数据赋值为0
  • 通用判断

    • np.all(array):判断array是否全为True
    • np.any(array):判断array中是否有True
  • 三元逻辑运算

    • np.where(array>num, 1, 0):把array中元素大于num的设置成1,否则设置成0.
    • 复合逻辑
    1
    2
    np.logical_and(array>num1, array<num2) #同and,返回一个与array形状相同的True/Flase矩阵,满足条件的为True
    np.logical_or(array>num1, array<num2) #同or,返回一个与array形状相同的True/Flase矩阵,满足条件的为True
  • 统计运算

    • np.min(array,axis):返回沿axis轴最小值
    • np.max(array,axis):返回沿axis轴最大值
    • np.median(array,axis):返回沿axis轴中值
    • np.mean(array,axis):返回沿axis轴平均值
    • np.std(array,axis):返回沿axis轴标准差
    • np.var(array,axis):返回沿axis轴方差
    • np.argmax(array,axis):返回沿axis轴最大值的下标
    • np.argmin(array,axis):返回沿axis轴最小值的下标

ndarray间的运算

  • 数组与数之间的运算,分别对每个元素进行运算

  • 数组与数组间的运算

    • 加、减:shape得一样或者对低维数组使用广播机制进行拓展之后可以使它们的shape一样

    • 乘:前面的数组的行与后门数组的列必须使一致的,才能进行计算(M,N)*(N,L)=(M,L)

      1
      2
      3
      np.matmul(array,array)
      np.dot(array,array)
      # 区别在于matmul禁止使用矩阵与标量相乘

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 zoubinbf@163.com

×

喜欢就点赞,疼爱就打赏