Numpy使用

Numpy

1)Numpy介绍

Numpy(Numeriacal Python) 是一个开源的Python科学计算库,用于快速处理任意维度数据。

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

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

2)ndarray介绍

NumPy提供了一个N维数组类型ndarray,它描述了相同类型的"items"的集合

使用ndarray进行存储:

import numpy as np

# 创建ndarray
score = np.array(
[[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])


注:使用numpy计算速度会比python原生计算的时间快很多很多。

机器学习的最大特点就是大量是数据运算。

Numpy专门针对ndarray的操作和运算进行了设计,所以数据的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。

可是ndarray为什么可以这么快呢?

3)ndarray的优势

3.1内存块风格

  • ndarray在存储数据的时候,数据与地址都是连续的,这样就使得批量操作数组的速度更快
  • ndarray的所有元素类型相同,一体式存储

3.2支持并行化运算

  • numpy内置了并行运算功能,当系统有多个核心的时候,做某种计算,numpy会自动进行并行计算

3.3.底层实现C

  • numpy底层使用C语言编写,内部解除了GIL(全局解释锁),其对数组的操作速度不受python解释器的限制

4)N维数据—ndarray

4.1ndarray的属性

数组属性反映了数组本身固有的信息。

属性名字 属性解释
ndarray.shape 数组维度的元组
ndarray.ndim 数组维数
ndarray.size 数组中的元素数量
ndarray.itemsize 一个数组元素的长度(字节)
ndarray.dtype 数组元素的类型

5)ndarray的基本操作

5.1生成数组的方法

  • 生成全是0和1的数组

    • np.ones(shape,dtype)
    • np.ones_like(a,dtype)
    • np.zeros(shape,dtype)
    • no.zeros_like(a,dtype)
  • 从现有数组生成

    • np.array(object,dtype)
    • np.asarray(a,dtype)
    • array是生成一个新的数组,而asarray是将原来的数组进行改变
    • array相当于深拷贝,asarray相当于浅拷贝
  • 生成固定范围的数组

    • np.linspace(start,stop,num,endpoint)
    • 创建等差数组——指定数量的
    • 参数
      • start 序列起始值
      • stop 序列终止值
      • num 要生成的等间隔阳历数量,默认是50
      • endpoint序列中是否包含stop值,默认为True
    # 生成等间隔的数组
    np.linspace(0,100,11)
    # 结果
    array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.])
    
    • np.arange(start,sop,step,dtype)
    • 创建的等差数组——指定步长
    • 参数
      • step : 步长,默认为1
    # 生成等步长的数组
    np.arange(10,50,2)
    # 结果
    array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
           44, 46, 48])
    
    • np.logspace(start,stop,num)
    • 创建等比数列
    • 参数
      • num:要生成的等比数列数列,默认50
    # 生成10^x
    np.logspace(0,2,3)
    # 结果
    array([  1.,  10., 100.])
    
  • 生成随机数组

    # 使用模块
    np.random模块
    
  • 正态分布

  • a. 什么是正态分布

    正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的方差,所以正态分布记作N(μ,σ )

  • b. 正态分布的应用

    生活、生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。

    c. 正态分布特点

    μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。

    标准差如何来?

    • 方差

    是在概率论和统计方差衡量一组数据时离散程度的度量

在这里插入图片描述

其中M为平均值,n为数据总个数,σ 为标准差,σ ^2可以理解一个整体为方差

Numpy使用_第1张图片

  • 标准差与方差的意义

可以理解成数据的一个离散程度的衡量

  • 正态分布的创建方式

  • np.random.randn(d0,d1,…dn)

    功能:从标准正太分布中返回一个或多个样本值

  • np.random.normal(loc=0.0,scale=1.0,size=None)

    loc : float

    此概率分布的均值(对应着整个分布中心center)

    scale:float

    此概率分布的的标准差(对应的分布的宽度,scale越大越矮胖,scale越小越瘦高)

    size:int or tuple of inst

    输出的shape,默认为None,只输出一个值

  • np.random.standard_normal(size=None)

    返回指定形状的标准正太分布的数组

举例1:生成均值为1.75,标准差为1的正态分布数据,100000000个
x = np.random.normal(loc=1.75,scale=1,100000000)

plt.figure(figsize=(20,8),dpi=100)

plt.hist(x,1000)

plt.show()
举例2:随机生成4支股票1周的交易日涨幅数据

4支股票,**一周(5天)**的涨跌幅数据,如何获取?

  • 随机生成涨跌幅在某个正态分布内,比如均值0,方差1
股票涨跌幅数据的创建
# 创建符合正态分布的4只股票5天的涨跌幅数据
stock_change = np.random.normal(0, 1, (4, 5))
stock_change
  • 均匀分布

    • np.random.rand(d0,d1…dn)

      • 返回[0.0,1.0)内的一组均匀分布的数
    • np.random.uniform(low=0.0,high=1.0,size=None)

      功能:从一个均匀分布[low,high)中随机采样,定义域是左闭右开

      参数介绍

      • low,采样下届,float类型,默认为0
      • high,采样上界,float类型,默认为1
      • size,输出样式数目,为int或元组类型。缺省时输出1个值

      返回值:ndarray类型,形状和参数size中描述一致

    • np.rrandom.randint(low,high=None,size=None,dtype=‘I’)

      从一个均匀分布中随机采样,生成一个整数或N维整数数组

      取数范围:若high不为None时,取[low,high之间随机整数,否则取[0,low)之间的随机整数

  • 画图查看分布状况

import matplot.pyplot as plt
import random
plt.figure(figsize=(20,8),dpi=100)

x1 = np.random.unifore(-1,1,1000000)

plt.hist(x=x1,bins=1000)

plt.show()
  • 数据的索引切片

一二三维数组,都可以直接进行索引,切片。或者对象[:,:] 先行后列的切。

二维数组索引方式:

  • 举例:获取第一个股票的前3个交易日的涨跌幅数据
# 二维的数组,两个维度 
stock_change[0, 0:3]
  • 三维数组索引方式:
# 三维
a1 = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])
# 返回结果
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[12,  3, 34],
        [ 5,  6,  7]]])
# 索引、切片
>>> a1[0, 0, 1]   
  • 形状修改

ndarray.reshape(shape,order)

返回一个具有相同数据域,但shape不一样的视图

行列不进行互换

# 在转换形状的时候,一定要注意数组的元素匹配
a.reshape([5,4])
a.reshape([-1,10]) # 数组的形状被修改为: (2, 10), -1: 表示通过待计算

ndarray.resize(new_shape)

修改数组本身的形状(需要保持元素个数前后相同)

行列不进行互换

a.resize([5,4])

a.shape

ndarray.T

数组的转置

将数组的行、列互换

a.T
  • 类型修改

ndarray.astype(type)

返回修改了类型之后的数组

a.astype(np.int32)

ndarray.tostring([order])或者ndarray.tobytes([order])

构造包含数组中原始数据字节的python字节

arr = np.array([[[1, 2, 3], [4, 5, 6]], [[12, 3, 34], [5, 6, 7]]])
arr.tostring
  • 数组的去重

np.unique()

temp = np.array([[1,2,3,4],[3,4,5,6]])
ret = np.unique(temp)
ret
#结果
array([1,2,3,4,5,6])

6)ndarray运算

1.逻辑运算

# 生成10名同学,5门功课的数据
score = np.random.randint(40,100.(10,5))

# 取出最后4名同学的成绩
test_score = score[6:,0:5]

# 逻辑判断,如果成绩大于60标记为True,否则为False
test_score > 60

# BOOL赋值,将满族条件的设置为指定的值--布尔索引
test_score[test_score > 60] =1

2.通用判断函数
# 判断前两名同学的成绩,是否全及格
np.all(score[:2,:] > 60)

# 判断前两名同学的成绩,是否有大于90
np.any(score[:2,:] > 90)
3.np.where(三元运算符)
# 判断前四名学生,前四门课程中,成绩中大于60的置为1,否则为0
np.where(score[:4,:4] > 60, 1, 0)


# 判断前四名学生,前四门课程中,成绩中大于60且小于90的换为1,否则为0
np.where(np.logical_and(temp > 60, temp < 90), 1, 0)

# 判断前四名学生,前四门课程中,成绩中大于90或小于60的换为1,否则为0
np.where(np.logical_or(temp > 90, temp < 60), 1, 0)
4.统计运算

在数据挖掘/机器学习领域,统计指标的值也是我们分析问题的一种方式。常用的指标如下:

  • min(a, axis)
    • Return the minimum of an array or minimum along an axis.
  • max(a, axis])
    • Return the maximum of an array or maximum along an axis.
  • median(a, axis)
    • Compute the median along the specified axis.
  • mean(a, axis, dtype)
    • Compute the arithmetic mean along the specified axis.
  • std(a, axis, dtype)
    • Compute the standard deviation along the specified axis.
  • var(a, axis, dtype)
    • Compute the variance along the specified axis.

7)数组间运算

1.数组与数的运算

arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr + 1 
arr / 2

# 可以对比python列表的运算,看出区别
a = [1, 2, 3, 4, 5]
a * 3

2.数组与数组的运算

arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr2 = np.array([[1, 2, 3, 4], [3, 4, 5, 6]])

# 这两个是不能够进行运算的

2.1广播机制

数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样,就可以进行矢量化运算了。下面通过一个例子进行说明:

arr1 = np.array([0],[1],[2],[3])
arr.shape
# (4,1)

arr2 = np.array([1,2,3])
arr.shape
# (3,)

arr1 + arr2
# 结果是:
array([[1, 2, 3],
       [2, 3, 4],
       [3, 4, 5],
       [4, 5, 6]])

上述代码中,数组arr1是4行1列,arr2是1行3列。这两个数组要进行相加,按照广播机制会对数组arr1和arr2都进行扩展,使得数组arr1和arr2都变成4行3列。

广播机制实现了时两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只需要满足如下任意一个条件即可。

  • 1.数组的某一维度等长。
  • 2.其中一个数组的某一维度为1 。

广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。

8)数学:矩阵

1.矩阵
  • 矩阵,英文matrix,和array的区别矩阵必须是2维的,但array是可以多维的。
  • 矩阵的维数即行数×列数
2.向量
  • 向量,是一种特殊的矩阵
3.加法和标量乘法
  • 矩阵的加法,行列数相等的可以加。
  • 矩阵的乘法,每个元素都要乘。
4.矩阵向量乘法
  • 矩阵和向量的乘法: m×n 的矩阵乘以 n×1 的向量,得到的是 m×1 的向量

  • 矩阵乘法遵循准则:

    (M行, N列)*(N行, L列) = (M行, L列)

5.矩阵乘法的性质

矩阵的乘法不满足交换律:A×B≠B×A

矩阵的乘法满足结合律。即:A×(B×C)=(A×B)×C

单位矩阵:在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的 1,我们称 这种矩阵为单位矩阵.它是个方阵,一般用 I 或者 E 表示,从 左上角到右下角的对角线(称为主对角线)上的元素均为 1 以外全都为 0。如:

6.矩阵的逆和转置

矩阵的逆:如矩阵 A 是一个 m×m 矩阵(方阵),如果有逆矩阵,则:

AA-1 = A-1A = I

低阶矩阵求逆的方法:

1.待定系数法

2.初等变换

矩阵的转置:设 A 为 m×n 阶矩阵(即 m 行 n 列),第 i 行 j 列的元素是 a(i,j),即:

A=a(i,j)

定义 A 的转置为这样一个 n×m 阶矩阵 B,满足 B=a(j,i),即 b (i,j)=a (j,i)(B 的第 i 行第 j 列元素是 A 的第 j 行第 i 列元素),记 AT =B。

直观来看,将 A 的所有元素绕着一条从第 1 行第 1 列元素出发的右下方 45 度的射线作 镜面反转,即得到 A 的转置。

简单来说矩阵的转置就是行变成列,列变成行。

7.矩阵乘法api
  • np.matmul
  • np.dot
 a = np.array([[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]])
    
b = np.array([[0.7], [0.3]])

np.matmul(a,b)
array([[81.8],
       [81.4],
       [82.9],
       [90. ],
       [84.8],
       [84.4],
       [78.6],
       [92.6]])


np.dot(a,b)
array([[81.8],
       [81.4],
       [82.9],
       [90. ],
       [84.8],
       [84.4],
       [78.6],
       [92.6]])

np.matmul和np.dot的区别:

二者都是矩阵乘法。 np.matmul中禁止矩阵与标量的乘法。 在矢量乘矢量的內积运算中,np.matmul与np.dot没有区别。

你可能感兴趣的:(Numpy)