Python之numpy详细教程

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之numpy详细教程相关的知识,希望对你有一定的参考价值。

Numpy介绍

在这里插入图片描述

NumPy(Numerical Python) 是科学计算基础库,提供大量科学计算相关功能,比如数据 统计,随机数生成等。其提供最核心类型为多维数组类型(ndarray),支持大量的维度数组 与矩阵运算,Numpy 支持向量处理 ndarray 对象,提高程序运算速度。

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

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

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

ndarray介绍

NumPy provides an N-dimensional array type, the ndarray,
which describes a collection of “items” of the same type.

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]]) 
score

返回结果:

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]])

提问:

使用Python列表可以存储一维数组,通过列表的嵌套可以实现多维数组,那么为什么还需要使用Numpyndarray呢?

ndarray与Python原生list运算效率对比

在这里我们通过一段代码运行来体会到ndarray的好处

import random 
import time 
import numpy as np 
a = [] for i in range(100000000): 
a.append(random.random()) 
# 通过%time魔法方法, 查看当前行的代码运行一次所花费的时间 
%time sum1=sum(a) 
b=np.array(a) 
%time sum2=np.sum(b)

其中第一个时间显示的是使用原生Python计算时间,第二个内容是使用numpy计算时间:

CPU times: user 852 ms, sys: 262 ms, total: 1.11 s 
Wall time: 1.13 s

CPU times: user 133 ms, sys: 653 µs, total: 133 ms 
Wall time: 134 ms

从中我们看到ndarray的计算速度要快很多,节约了时间。

机器学习的最大特点就是大量的数据运算,那么如果没有一个快速的解决方案,那可能现在python也在机器学习领域达不到好的效果。

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

ndarray为什么可以这么快?

ndarray的优势

内存块风格

ndarray到底跟原生python列表有什么不同呢,请看一张图:

在这里插入图片描述
从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。

这是因为ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpyndarray不及Python原生list,但在科学计算中,Numpyndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。

ndarray支持并行化运算(向量化运算)

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

效率远高于纯Python代码

Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,所以,其效率远高于纯 Python代码。

Numpy安装

安装 NumPy 最简单的方法就是使用 pip 工具,语法格式如下:

pip install numpy

arange 函数测试环境安装

import numpy as np 
a=np.arange(10) 
print(a)

在这里插入图片描述
在上面的程序中只涉及 numpy 模块中的一个 arange 函数,该函数可以传入一个整数类型的参数 n,函数返回值看着像一个列表,其实返回值类型是 numpy.ndarray。这是 Numpy 中特有的数组类型。如果传入 arange 函数的参数值是 n,那么 arange 函数会返回 0 到 n-1 的 ndarray 类型的数组。

N维数组-ndarray

array 创建

numpy 模块的 array 函数可以生成多维数组。例如,如果要生成一个二维数组,需要向 array 函数传递一个列表类型的参数。每一个列表元素是一维的 ndarray 类型数组,作为二维数组的行。另外,通过 ndarray 类的 shape 属性可以获得数组每一维的元素个数(元组形式), 也可以通过 shape[n]形式获得每一维的元素个数,其中 n 是维度,从 0 开始。

语法格式如下:

在这里插入图片描述在这里插入图片描述
ndmin 参数的使用

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

在这里插入图片描述

dtype 参数的使用

a=np.array([1,2,3,4,5,6],dtype=complex) 
print(a)

在这里插入图片描述

ndarray的属性

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

在这里插入图片描述

ndarray的形状

首先创建一些数组。

# 创建不同形状的数组 
>>> a = np.array([[1,2,3],[4,5,6]]) 
>>> b = np.array([1,2,3,4]) 
>>> c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])

分别打印出形状

>>> a.shape 
>>> b.shape 
>>> c.shape 
(2, 3) # 二维数组 
(4,) # 一维数组 
(2, 2, 3) # 三维数组

如何理解数组的形状?

二维数组:

在这里插入图片描述
三维数组:

在这里插入图片描述

ndarray的类型

>>> type(score.dtype) 
<type 'numpy.dtype'>

dtypenumpy.dtype类型,先看看对于数组来说都有哪些类型:

在这里插入图片描述
创建数组的时候指定类型

>>> a = np.array([[1, 2, 3],[4, 5, 6]], dtype=np.float32) >>> a.dtype 
dtype('float32') 

>>> arr = np.array(['python', 'tensorflow', 'scikit-learn', 'numpy'], dtype = np.string_) 
>>> arr 
array([b'python', b'tensorflow', b'scikit-learn', b'numpy'], dtype='|S12')

注意:若不指定,整数默认int64,小数默认float64

总结

数组的基本属性

在这里插入图片描述

基本操作

生成数组的方法

生成0和1的数组

np.ones(shape, dtype)
np.ones_like(a, dtype)
np.zeros(shape, dtype)
np.zeros_like(a, dtype)

ones = np.ones([4, 8])
ones
array([[1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1.]])
np.zeros_like(ones)
array([[0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0.]])

np.empy()

numpy.empty方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的 数组,里面的元素的值是之前内存的值:

numpy.empty(shape, dtype = float, order = 'C')

在这里插入图片描述
empty 创建

x=np.empty([3,2],dtype=int) 
print(x)

在这里插入图片描述

从现有数组生成

生成方式

np.array(object, dtype)
np.asarray(a, dtype)

a = np.array([[1,2,3],[4,5,6]]) 
# 从现有的数组当中创建 
a1 = np.array(a) 
# 相当于索引的形式,并没有真正的创建一个新的 
a2 = np.asarray(a)

关于array和asarray的不同

在这里插入图片描述在这里插入图片描述

生成固定范围的数组

np.linspace (start, stop, num, endpoint)

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
  • 创建等差数组 — 指定数量
  • 参数:
    • start:序列的起始值
    • stop:序列的终止值
    • num:要生成的等间隔样例数量,默认为50
    • endpoint:序列中是否包含stop值,默认为ture
    • retstep:如果为 True 时,生成的数组中会显示间距,反之不显示。
    • dtype:ndarray 的数据类型
# 生成等间隔的数组 
np.linspace(0, 100, 11)

返回结果:

array([ 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.])

np.arange(start,stop, 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模块

正态分布

什么是正态分布?

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

在这里插入图片描述
正态分布的应用

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

正态分布特点

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

标准差如何来?

  • 方差
    是在概率论和统计方差衡量一组数据时离散程度的度量
    在这里插入图片描述
    其中M为平均值,n为数据总个数,σ 为标准差,σ ^2可以理解一个整体为方差

在这里插入图片描述

  • 标准差与方差的意义
    可以理解成数据的一个离散程度的衡量

在这里插入图片描述
正态分布创建方式

  • np.random.randn(d0, d1, …, dn)
    功能:从标准正态分布中返回一个或多个样本值
  • np.random.normal(loc=0.0, scale=1.0, size=None)

loc:float
此概率分布的均值(对应着整个分布的中心centre)
scale:float
此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints
输出的shape,默认为None,只输出一个值
np.random.standard_normal(size=None)
返回指定形状的标准正态分布的数组。

举例1:生成均值为1.75,标准差为1的正态分布数据,100000000个

x1 = np.random.normal(1.75, 1, 100000000)

返回结果:

array([2.90646763, 1.46737886, 2.21799024, ..., 1.56047411, 1.87969135, 0.9028096 ])
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)

# 2.绘制图像
plt.hist(x1, 1000)  # 1000组

# 3. 显示图像
plt.show()

在这里插入图片描述
例如:我们可以模拟生成一组股票的涨跌幅的数据

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

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

  • 随机生成涨跌幅在某个正态分布内,比如均值0,方差1

股票涨跌幅数据的创建

# 创建符合正态分布的4只股票5天的涨跌幅数据
stock_change = np.random.normal(0, 1, (4, 5)) 
stock_change
array([[-0.90442265, -1.17400313, -0.25891122, -0.60057691,  0.19973249],
       [-0.23449971, -1.01396609, -0.08161324, -1.61459823, -2.05132145],
       [ 0.0700032 ,  1.28480273, -1.17703456,  0.09298

以上是关于Python之numpy详细教程的主要内容,如果未能解决你的问题,请参考以下文章

回炉重造Python之numpy详细教程(2万字总结)

Python基础 | Numpy详细教程

python numpy svd

python关于numpy基础问题

python怎么卸载numpy

NumPy库