美文网首页
NumPy科学计算库

NumPy科学计算库

作者: 小帅明3号 | 来源:发表于2020-11-26 16:21 被阅读0次

NumPy(Numerical Python)是Python的⼀种开源的数值计算扩展。提供多维数组对象,各种派⽣对象(如掩码数组和矩阵),这种⼯具可⽤来存储和处理⼤型矩阵,⽐Python⾃身的嵌套列表(nestedlist structure)结构要⾼效的多(该结构也可以⽤来表示矩阵(matrix)),⽀持⼤量的维度数组与矩阵运算,此外也针对数组运算提供⼤量的数学函数库,包括数学、逻辑、形状操作、排序、选择、输⼊输出、离散傅⽴叶变换、基本线性代数,基本统计运算和随机模拟等等。

  • NumPy的功能强⼤
    1.强⼤的N维数组
    2.成熟的⼴播功能
    3.⽤于整合C/C++和Fortran代码的⼯具包
    4.NumPy提供了全⾯的数学功能、随机数⽣成器和线性代数功能
  • 安装Python库
    1.开发工具(类似pycharm,在浏览器里而已):pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple
    2.pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 启动终端
    1.Windows----> 快捷键:win + R ----->输⼊:cmd回⻋------>命令⾏出来 Mac ---->启动终端
    2.启动jupyter
    3.进⼊终端输⼊指令:jupyter notebook
    4.在哪⾥启动jupyter,浏览器上的⽬录就对应那⾥
    5.jupyter扩展插件
    pip install jupyter_contrib_nbextensions -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install jupyter_nbextensions_configurator -i https://pypi.tuna.tsinghua.edu.cn/simple
    jupyter contrib nbextension install --user
    jupyter nbextensions_configurator enable --user
    设置:
    a.重启jupyter,菜单栏多了一个插件(Nbextensions),点击进入,去掉左上角的全选对勾
    b.多勾选:标题(Table of Contents)、代码提示(Hinterland)、折叠代码(Codefolding)、折叠标题(Collapsible Headings)
    已勾选的不用动了

数组创建

import numpy as np
l = [1,3,5,7,9] # 列表
arr = np.array(l) # 将列表转换为NumPy数组
arr # 数据⼀样,NumPy数组的⽅法,功能更加强⼤
# 输出为
# array([1, 3, 5, 7, 9])

import numpy as np
arr1 = np.ones(10) # 输出为:array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
arr2 = np.zeros(10) # 输出为: array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
arr3 = np.full(shape = [2,3],fill_value=2.718)
# 输出为:
# array([[2.718, 2.718, 2.718],
# [2.718, 2.718, 2.718]])
arr4 = np.arange(start = 0,stop = 20,step = 2)
# 等差数列 输出为:array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
arr5 = np.linspace(start =0,stop = 9,num = 10)
# 等差数列 输出为:array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
arr6 = np.random.randint(0,100,size = 10)
# int随机数 输出为:array([ 4, 8, 79, 62, 34, 35, 2, 65, 47, 18])
arr7 = np.random.randn(5)
# 正态分布 输出为:array([ 0.57807872, 0.37922855, 2.37936837, -0.28688769,
0.2882854 ])
arr8 = np.random.random(size = 5)
# float 随机数 输出为:array([0.59646412, 0.37960586, 0.38077327, 0.76983539,
0.22689201])  

数组的轴数、维度、尺寸形状
import numpy as np
arr = np.random.randint(0,100,size = (3,4,5))
arr.ndim # 输出 3
import numpy as np
arr = np.random.randint(0,100,size = (3,4,5))
arr.shape # 输出 (3,4,5)
数组元素的总数
import numpy as np
arr = np.random.randint(0,100,size = (3,4,5))
arr.size # 输出 3*4*5 = 60

索引、切⽚和迭代

arr = np.array([0,1,2,3,4,5,6,7,8,9])
arr[5] #索引 输出 5
arr[5:8] #切⽚输出:array([5, 6, 7])
arr[2::2] # 从索引2开始每两个中取⼀个 输出 array([2, 4, 6, 8])
arr[::3] # 不写索引默认从0开始,每3个中取⼀个 输出为 array([0, 3, 6, 9])
arr[1:7:2] # 从索引1开始到索引7结束,左闭右开,每2个数中取⼀个 输出 array([1, 3, 5])
arr[::-1] # 倒序 输出 array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
arr[::-2] # 倒序 每两个取⼀个 输出 array([9, 7, 5, 3, 1])
arr[5:8]=12 # 切⽚赋值会赋值到每个元素上,与列表操作不同
temp = arr[5:8]
temp[1] = 1024
arr # 输出:array([ 0, 1, 2, 3, 4, 12, 1024, 12, 8, 9])

arr2d = np.array([[1, 3, 5], [2, 4, 6], [-2, -7, -9], [6, 6, 6]])  # ⼆维数组 shape(3,4)
arr2d[0, -1]  # 索引 等于arr2d[0][-1] 输出 5
arr2d[0, 2]  # 索引 等于arr2d[0][2] == arr2d[0][-1] 输出 5
arr2d[:2, -2:]  # 切⽚ 第⼀维和第⼆维都进⾏切⽚ 等于arr2d[:2][:,1:]
arr2d[:2, 1:]  # 切⽚ 1 == -2 ⼀个是正序,另个⼀是倒序,对应相同的位置
# 输出:
# array([[3, 5],
# [4, 6]])

花式索引
import numpy as np

# ⼀维
arr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
arr2 = arr1[[1, 3, 3, 5, 7, 7, 7]]  # 输出 array([2, 4, 4, 6, 8, 8, 8])
arr2[-1] = 1024  # 修改值,不影响arr1
# ⼆维
arr2d = np.array([[1, 3, 5, 7, 9], [2, 4, 6, 8, 10], [12, 18, 22, 23, 37],
                  [123, 55, 17, 88, 103]])  # shape(4,5)
arr2d[[1, 3]]  # 获取第⼆⾏和第四⾏,索引从0开始的所以1对应第⼆⾏
# 输出 array([[ 2, 4, 6, 8, 10],
# [123, 55, 17, 88, 103]])
arr2d[([1,3],[2,4])] # 相当于arr2d[1,2]获取⼀个元素,arr2d[3,4]获取另⼀个元素
# 输出为 array([ 6, 103])
# 选择⼀个区域
arr2d[np.ix_([1,3,3,3],[2,4,4])] # 相当于 arr2d[[1,3,3,3]][:,[2,4,4]]
arr2d[[1,3,3,3]][:,[2,4,4]]
# ix_()函数可⽤于组合不同的向量
# 第⼀个列表存的是待提取元素的⾏标,第⼆个列表存的是待提取元素的列标
# 输出为
# array([[ 6, 10, 10],
# [ 17, 103, 103],
# [ 17, 103, 103],
# [ 17, 103, 103]])

boolean值索引
names =
np.array(['softpo','Brandon','Will','Michael','Will','Ella','Daniel','softpo','
Will','Brandon'])
cond1 = names == 'Will'
cond1
# 输出array([False, False, True, False, True, False, False, False, True,
False])
names[cond1] # array(['Will', 'Will', 'Will'], dtype='<U7')
arr = np.random.randint(0,100,size = (10,8)) # 0~100随机数
cond2 = arr > 90
# 找到所有⼤于90的索引,返回boolean类

形状操作

数组变形-从原来数组顺序取数拼凑变形后的数组
import numpy as np
arr1 = np.random.randint(0,10,size = (3,4,5))
arr2 = arr1.reshape(12,5) # 形状改变,返回新数组
arr3 = arr1.reshape(-1,5) # ⾃动“整形”,⾃动计算
数组转置-行转列,列转行-   都不会改变原数组
import numpy as np
arr1 = np.random.randint(0,10,size = (3,5)) # shape(3,5)
arr1.T # shape(5,3) 转置
arr2 = np.random.randint(0,10,size = (3,6,4)) # shape(3,6,4),
np.transpose(arr2,axes=(2,0,1)) # transpose改变数组维度 shape(4,3,6)
数组堆叠
import numpy as np
arr1 = np.array([[1,2,3]])
arr2 = np.array([[4,5,6]])
np.concatenate([arr1,arr2],axis = 0)
# 串联合并shape(2,3) axis = 0表示第⼀维串联 输出为
# array([[1, 2, 3],
# [4, 5, 6]])
np.concatenate([arr1,arr2],axis = 1)
# shape(1,6) axis = 1表示第⼆维串联 输出为:array([[1, 2, 3, 4, 5, 6]])
np.hstack((arr1,arr2)) # ⽔平⽅向堆叠 输出为:array([[1, 2, 3, 4, 5, 6]])
np.vstack((arr1,arr2))
#筛选数组,保留第5列满足条件的行
arr_new = arr_old[arr_old[:,4]>=条件,:]
# 竖直⽅向堆叠,输出为:
# array([[1, 2, 3],
# [4, 5, 6]])
split数组拆分
import numpy as np
arr = np.random.randint(0,10,size = (6,5)) # shape(6,5)
np.split(arr,indices_or_sections=2,axis = 0) # 在第⼀维(6)平均分成两份
np.split(arr,indices_or_sections=[2,3],axis = 1) # 在第⼆维(5)以索引2,3为断点分割
成3份
np.vsplit(arr,indices_or_sections=3) # 在竖直⽅向平均分割成3份
np.hsplit(arr,indices_or_sections=[1,4]) # 在⽔平⽅向,以索引1,4为断点分割成3份

⼴播机制

当两个数组的形状并不相同的时候,我们可以通过扩展数组的⽅法来实现相加、相减、相乘等操作,这
种机制叫做⼴播(broadcasting),行不够向行上广播(复制相同的运算),列不够向列上广播(复制相同的运算);广播时数组要对齐


image.png

import numpy as np
arr1 = np.sort(np.array([0,1,2,3]*3)).reshape(4,3) #shape(4,3)
arr2 = np.array([1,2,3]) # shape(3,)
arr3 = arr1 + arr2 # arr2进⾏⼴播复制4份 shape(4,3)
arr3


image.png
import numpy as np
arr1 = np.sort(np.array([0, 1, 2, 3] * 3)).reshape(4, 3) # shape(4,3)
arr2 = np.array([[1], [2], [3], [4]]) # shape(4,1)

arr3 = arr1 + arr2 # arr2 进⾏⼴播复制3份 shape(4,3)
arr3


image.png
import numpy as np
arr1 = np.array([0, 1, 2, 3, 4, 5, 6, 7] * 3).reshape(3, 4, 2) # shape(3,4,2)
arr2 = np.array([0, 1, 2, 3, 4, 5, 6, 7]).reshape(4, 2) # shape(4,2)
arr3 = arr1 + arr2 # arr2数组在0维上复制3份 shape(3,4,2)
arr3
image.png

通⽤函数

通⽤函数:元素级数字函数
import numpy as np
arr1 = np.array([1, 4, 8, 9, 16, 25])
np.sqrt(arr1)  # 开平⽅
np.square(arr1)  # 平⽅
np.clip(arr1, 2, 16)  # 输出 array([ 2, 4, 8, 9, 16, 16]),将arr1限制在2,16之间,超出范围的都置为对应边界的值
x = np.array([1, 5, 2, 9, 3, 6, 8])
y = np.array([2, 4, 3, 7, 1, 9, 0])
np.maximum(x, y)  # 返回两个数组中的⽐较⼤的值array([2, 5, 3, 9, 3, 9, 8])
arr2 = np.random.randint(0, 10, size=(5, 5))
np.inner(arr2[0], arr2)  # 返回⼀维数组向量内积 array([15,  6,  4, 14,  6])
where函数
import numpy as np
arr1 = np.array([1, 3, 5, 7, 9])
arr2 = np.array([2, 4, 6, 8, 10])
cond = np.array([True, False, True, True, False])
np.where(cond, arr1, arr2)  # True选择arr1,False选择arr2的值
# 输出 array([ 1, 4, 5, 7, 10])
arr3 = np.random.randint(0, 30, size=20)
np.where(arr3 < 15, arr3, -15)  # ⼩于15还是⾃身的值,⼤于15设置成-15
排序⽅法
import numpy as np
arr = np.array([9, 3, 11, 6, 17, 5, 4, 15, 1])
arr.sort()  # 直接改变原数组
np.sort(arr)  # 返回深拷⻉排序结果
arr = np.array([9, 3, 11, 6, 17, 5, 4, 15, 1])
arr.argsort()  # 返回从⼩到⼤排序索引 array([8, 1, 6, 5, 3, 0, 2, 7, 4])
集合运算函数
A = np.array([2,4,6,8])
B = np.array([3,4,5,6])
np.intersect1d(A,B) # 交集 array([4, 6])
np.union1d(A,B) # 并集 array([2, 3, 4, 5, 6, 8])
np.setdiff1d(A,B) #差集,A中有,B中没有 array([2, 8])
数学和统计函数
import numpy as np
arr1 = np.array([1,7,2,19,23,0,88,11,6,11])
arr1.min() # 计算最⼩值 0
arr1.argmax() # 计算最⼤值的索引 返回 6
np.argwhere(arr1 > 20) # 返回⼤于20的元素的索引
np.cumsum(arr1) # 计算累加和
arr2 = np.random.randint(0,10,size = (4,5))
arr2.mean(axis = 0) # 计算列的平均值
arr2.mean(axis = 1) # 计算⾏的平均值
np.cov(arr2,rowvar=True) # 协⽅差矩阵
np.corrcoef(arr2,rowvar=True) # 相关性系数

线性代数

#矩阵的乘积
A = np.array([[4,2,3],
[1,3,1]]) # shape(2,3)
B = np.array([[2,7],
[-5,-7],
[9,3]]) # shape(3,2)
np.dot(A,B) # 矩阵运算 A的最后⼀维和B的第⼀维必须⼀致
A @ B # 符号 @ 表示矩阵乘积运算

# 计算矩阵的逆
from numpy.linalg import inv, det, eig, qr, svd
A = np.array([[1, 2, 3],
              [2, 3, 4],
              [4, 5, 8]])  # shape(3,3)
inv(t)  # 逆矩阵
det(t)  # 计算矩阵⾏列式

相关文章

  • NumPy学习-初见

    NumPy 是 Python 中科学计算的基础包,很多其他的科学计算库都是构建在这个库之上,在 Numpy 官网上...

  • Python:一篇文章掌握Numpy的基本用法

    前言 Numpy是一个开源的Python科学计算库,它是python科学计算库的基础库,许多其他著名的科学计算库如...

  • 一、numpy

    1、科学计算库numpy 输出: ['3.542485' '1.9...

  • Numpy的一些小知识 - 01

    Numpy是科学计算当中最常用的python工具库之一,是很多工具库的基础,掌握Numpy的一些基本概念对科学计算...

  • Python——ndarray多维数组对象介绍

    1.Numpy库介绍: Numpy是Numercial Python的简称,是一个开源的Python科学计算基础库...

  • 科学计算库numpy

    交换矩阵的其中两行 输出 :[[ 0 1 2 3 4][ 5 6 7 8 9][10 11 12 ...

  • NumPy科学计算库

    NumPy(Numerical Python)是Python的⼀种开源的数值计算扩展。提供多维数组对象,各种派⽣对...

  • Numpy 科学计算库

    备注:output代码的--------------是我自己加的,在input中没有相关代码。 相关概念Numpy...

  • Python Scipy库

    Scipy库的简介 Scipy高级科学计算库:和Numpy联系很密切,Scipy一般都是操控Numpy数组来...

  • Numpy | 基础操作(矩阵)

    NumPy 基础操作 什么是 NumPy NumPy是Python中科学计算的基础包。它是一个Python库,提供...

网友评论

      本文标题:NumPy科学计算库

      本文链接:https://www.haomeiwen.com/subject/xsxgiktx.html