Python 科学计算-Numpy

Python 科学计算-Numpy

NumPy(Numerical Python)是Python的一种开源的数值计算扩展,可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。

NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

Numpy 提供了两类基本对象:多维数组对象 ndarray (n-dimentional array object) 和 特殊函数对象ufunc (universal function object) 。本文以 Python3.7 版本为运行环境,主要探讨 Numpy 基本用法。

安装与导入

安装:直接用 pip 命令即可,下面两行代码分别安装 Numpy 和 Matplotlib

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib

导入:

import numpy as np

我们将numpy缩短为np是为了节省时间,同时保持代码的标准化

1.多维数组 ndarray

Numpy 的 Ndarray 对象为数组的处理提供了强大的便利,当然数组是一维到多维都可以 Numpy 中快速的处理。虽然 Numpy 也有矩阵 (Matrix)类型的数组。但推荐使用 array 对象,因为大部分数组操作以及函数均为 array 作为对象并且返回值也为 array 对象。

数组的生成

可以通过给 array() 函数传递 Python 的数据序列对象来创建数组,如果传递的是多层嵌套的序列,将创建多维数组。这种创建都是先创建一个 Python 的序列对象,然后通过 array 将其转换为数组。之外 Numpy 提供了很多专门创建数组的函数。

numpy.arange() 通过指定初值、终值和步长来创建等差数列的一维数组,所得到的结果中包含初值,不包含终值。

np.arange(0,5,0.5) # 0 到 5,步长为0.5
array([0.  0.5 1.  1.5 2.  2.5 3.  3.5 4.  4.5])

numpy.linspace() 通过指定初值、终值和元素个数来创建表示等差数列的一维数组,可以通过endpoint 参数指定是否包含终值,默认值为 True ,即包含终值。需要注意的是 endpoint 的值会改变数组的等差步长。

np.linspace(0,1,10,endpoint=False)
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])

numpy.logspace() 通过指定初值、终值和元素个数来创建表示等比数列的一维数组,基数可以通过 base 参数指定,其默认值为10,可以通过endpoint 参数指定是否包含终值,默认值为 True,即包含终值。

np.logspace(0,2,5)
array([1.   ,3.16227766 ,10.    ,31.6227766 , 100.   ])

np.logspace(0,2,5,base=2)
array([1.   ,1.41421356 ,2.     ,2.82842712 , 4.    ])

numpy.fromstring 从字节序列创建数组。Python 的字符串实际上是一个字节序列,每个字符占一个字节。类似的函数有frombuffer(),fromfile()。

st = "python"
np.fromstring(st,dtype=np.int8)

array([112, 121, 116, 104, 111, 110], dtype=int8)
#所得到的数组正好就是字符串中每个字符的ASCII码

numpy.fromfunction 定义一个从下标计算数值的函数,然后用此函数创建数组。fromfunction() 的第一个参数是计算每个数组元素的函数,第二个参数指定数组的形状。

def kod1(x):
    return x**2
np.fromfunction(kod1,(6,))
# 第二个参数是长度为6的元组(6,),因此创建了一个有6个元素的一维数组。

array([ 0.,  1.,  4.,  9., 16., 25.])
def kod2(x,y):
    return x+y
np.fromfunction(kod2,(5,5))

array([[0., 1., 2., 3., 4.],
       [1., 2., 3., 4., 5.],
       [2., 3., 4., 5., 6.],
       [3., 4., 5., 6., 7.],
       [4., 5., 6., 7., 8.]])

特殊数组

随机类

np.random.rand(4) #生成大小为4的随机一维数组,元素为0到1之间的实数
array([0.93624589, 0.17548912, 0.81248716, 0.72682557])

np.random.rand(2,3) #生成大小为(2,3)的随机矩阵,元素为0到1之间的实数
array([[0.1463617 , 0.91962383, 0.06822833],
       [0.37520596, 0.58522245, 0.37247154]])

np.random.randint(0,10,6) #产生一个长度为6 ,元素值为0到9的随机数姐,元素为整数
array([5, 7, 6, 7, 2, 8])
np.ones((3,4)) # 1 矩阵,大小为(3,4)
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])
np.zeros((2,4)) # 0 矩阵,大小为(2,4)
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.]])
np.eye(3) #单位矩阵,大小为(3,3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
np.empty((2,2)) # 空矩阵,大小(2,2)。
#只分配内存,不执行元素初始化,元素是随机的
array([[1., 3.],
       [5., 7.]])
np.full((2,3),6) # 指定填充的元素
array([[6, 6, 6],
       [6, 6, 6]])

zeros_like(),ones_like(),empty_like(),full_like() 等函数创建与参数数组的形状和类
型相同的数组,即 zeros_like(a) 等同与 zeros(a.shape,a.dtype)。

访问与更改

方括号 [] 来读取元素。

a = np.arange(10)

print("a =",a)
print("a[4] =",a[4])  #整数作为下标获取数组中的元素
print("a[-1] =",a[-1])#整数作为下标获取数组中的元素,负数代表从后开始
print("a[2:5] =",a[2:5])#切片作为下标获取数组的一部分,包含a[2],不包含a[5]
print("a[:6] =",a[:6])#切片中省略开始下标,表示从a[0]开始,一直到第6个元素
print("a[:-2] =",a[:-2])#切片中省略开始下标,表示从a[0]开始,一直到倒数第2个元素

print("----------------")
print("a[1:-1:2] =",a[1:-1:2])#切片中的第三个参数表示步长,2表示隔一个元素取一个元素(往后i)
print("a[8:2:-2] =",a[8:2:-2])#切片中的第三个参数表示步长,2表示隔一个元素取一个元素(往前)
print("a[::-1] =",a[::-1])#省略切片的开始下标和结束下标,步长为-1,整个数组头尾颠倒

结果:
a = [0 1 2 3 4 5 6 7 8 9]
a[4] = 4
a[-1] = 9
a[2:5] = [2 3 4]
a[:6] = [0 1 2 3 4 5]
a[:-2] = [0 1 2 3 4 5 6 7]
----------------
a[
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值