Numpy数组和矩阵

这篇具有很好参考价值的文章主要介绍了Numpy数组和矩阵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.numpy

主要用于高维的数组运算,拥有运算速度快的数学库;Numpy支持常见的数组和矩阵操作。Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

安装

windows:

升级 pip:

python3 -m pip install -U pip

安装 Numpy库:(Ubuntu一样)

pip install numpy

下载完成后可以在Python文件中

import numpy
print(numpy.__version__)

来测试是否安装成功

2.ndarray

ndarray是一个n为数组,是相同类型的items的集合。使用ndarray的计算速度大于使用list,并且数组越大,ndarray的优势越大,所以为了节省时间使用ndarray进行存储数据。

import numpy as np
# 创建ndarray
# 一维数组
a = np.array([1,2,3,4])
# 二维数组
b = np.array([[1,2],[3,4]])
# 三位数组
c = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])

ndarray在存储数据的时候,因为ndarray中的所有元素的类型都是相同的,所以数据与数据的地址都是连续的,批量操作数组元素时速度更快。这是而Python列表中的元素类型是任意的,存储类似数据结构中的链表。在科学计算中,Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。numpy内置了并行运算功能(向量化运算),当系统有多个核心时,做某种计算时,numpy会自动做并行计算

(1)ndarray属性
属性 含义
ndarray.shape 数组维度的元组
ndarray.ndim 数组维数
ndarray.size 数组中的元素数量
ndarray.itemsize 一个数组元素的长度(字节)
ndarray.dtype 数组元素的类型
(2)ndarray类型

因为并不像python的列表一样可以存放不同类型的值,而是和c语言一样存放相同类型的值,所以在创建数组时就需要指定类型

a = np.array([[1,2],[3,4],[5,6]], dtype=np.int32)
a = np.array([['hello'],['world']], dtype=np.string_)

dtype参数是指定数组类型,若不指定则若数组中为整数时数组类型默认为int64,若数组中为小数时默认为float64

名称 描述 简写
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’

3.生成数组

(1)生成全0或者全1数组
  • np.ones(shape, dtype):生成全1的数组
  • np.ones_like(a, dtype) :将数组a变为全1
  • np.zeros(shape, dtype):生成全0的数组
  • np.zeros_like(a, dtype) :将数组a变为全0
np.ones([2,3])
# array([[1., 1., 1.],
#        [1., 1., 1.]])

np.zeros([2,3])
# array([[0., 0., 0.],
#        [0., 0., 0.]])

a=[1,2,3,4]
np.zeros_like(a)
# array([0, 0, 0, 0])

b=np.ones([2,3])
np.zeros_like(b)
# array([[0., 0., 0.],
#        [0., 0., 0.]])
(2)从现有数组生成
  • 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)
print("a=",id(a))
print("a1=",id(a1))
print("a2=",id(a2))
# a= 1962211796784
# a1= 1962211788720
# a2= 1962211796784
(3)生成固定范围的数组
  • np.linspace (start, stop, num, endpoint):创建等差数组 — 指定数量
    • start:序列的起始值
    • stop:序列的终止值
    • num:要生成的等差数列数量,默认为50
    • endpoint:序列中是否包含stop值,默认为ture
  • np.arange(start,stop, step, dtype):创建等差数组 —指定步长
    • step:步长,默认值为1
  • np.logspace(start,stop, num,base,endpoint):创建等比数列
    • num:要生成的等比数列数量,默认为50
    • base:指定对数的底,默认为10
# 等差数列指定数量
a=np.linspace(1,10,5,endpoint=True)
# 等差数列指定步长
b=np.arange(1,10,3)
# 等比数列
c=np.logspace(start=0,stop=4,num=5,base=3) 
print(a)
print(b)
print(c)
# [ 1.    3.25  5.5   7.75 10.  ]
# [1 4 7]
# [ 1.  3.  9. 27. 81.]
(4)生成随机数组

需要导入np.random模块

  1. 简单随机数: 产生简单的随机数据,可以是任何维度
  2. 排列:将所给对象随机排列
  3. 分布:产生指定分布的数据,如高斯分布等
  4. 生成器:种随机数种子,根据同一种子产生的随机数是相同的
①正态分布

正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,记作N(μ,σ )。在我们生活、生产还有科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。

  • μ:服从正态分布的随机变量的均值,决定了其分布图像位置当μ=0时其图像中心在坐标轴中心0点

  • σ:此随机变量的标准差,决定了分布图像的幅度,即是瘦高还是矮胖,越小越瘦高,越大越矮胖

当μ=0,σ=1时,称为标准正态分布

方差公式:σ^2

Numpy数组和矩阵

标准差:σ

Numpy数组和矩阵

正态分布创建
  • np.random.randn(d0, d1, …, dn)

    从标准正态分布中返回一个或多个样本值 ,参数为维度,即(2,3)为两行三列

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

    • locμ

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

    • scaleσ

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

    • size

      输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出m*n*k个样本,缺省时输出1个值。

  • np.random.standard_normal(size=None)

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

# 从标准正态分布中生成一个两行三列的数组
np.random.randn(2,3)
#array([[ 0.68407956, -0.88465943,  1.8113405 ],[-0.91357418, -0.98786321,  0.53993901]])
np.random.normal(0.0, 1, 5)
# array([-0.37305115, -0.47308456,  0.59911597, -0.35238895,  1.03690121])
np.random.standard_normal(size=5)
# array([ 1.20745242,  0.32335983,  1.01082709, -2.10252691,  0.60383283])
# 1.生成均匀分布的随机数
x1 = np.random.normal(1.75, 1, 100000000)
x2 = np.random.normal(-2, 0.5, 100000000)
  # 创建一个标准正态分布进行比对
y= np.random.normal(0, 1, 100000000)
# 2.创建画布
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,5),dpi=100)
# 3.绘制直方图
axes[0].hist(x1, 1000)
axes[0].hist(y, 1000,color='r')
axes[1].hist(x2, 1000)
axes[1].hist(y, 1000,color='r')
# 4.图像保存不变
plt.savefig("./images/正态分布test1.png")
# 3)显示图像
plt.show()

Numpy数组和矩阵

③均匀分布
  • np.random.rand(d0, d1, ..., dn)

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

    • 功能:从一个均匀分布**[low,high)中随机采样,注意定义域是左闭右开**,即包含low,不包含high. 并且指的是x轴

    • low: 采样下界,float类型,默认值为0;

    • high: 采样上界,float类型,默认值为1;

    • size:

      输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出m*n*k个样本,缺省时输出1个值。

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

  • np.random.randint(low, high=None, size=None, dtype='l')

    • low: int

      生成的数值最低要大于等于low。(hign = None时,生成的数值要在[0, low)区间内)

    • high: int (可选)

      如果使用这个值,则生成的数值在[low, high)区间。

    • size:
      输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出m*n*k个样本,缺省时输出1个值。

np.random.randint(500,1000, size=10)
# array([664, 612, 887, 687, 987, 808, 776, 772, 635, 860])
np.random.uniform(-1, 1, 5)
# array([-0.6000072 ,  0.15313873,-0.59614837,  0.17145161, 0.97448999)
import matplotlib.pyplot as plt

# 生成均匀分布的随机数
x1 = np.random.uniform(-1, 1, 100000)
x2 = np.random.randint(500,1000, size=100000)
# 2.创建画布
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,5),dpi=100)
# 3.绘制直方图
axes[0].hist(x1, 1000)
# axes[0].hist(y, 1000,color='r')
axes[1].hist(x2, 1000)
# axes[1].hist(y, 1000,color='r')
# 4.图像保存不变
plt.savefig("./images/正态分布test1.png")
# 3)显示图像
plt.show()

Numpy数组和矩阵

4.数组索引、切片

# 三维数组
a = np.array([[[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]])

# 1.索引,按维度,第2行第1列
print("a[1,0]=",a[1,0])
# a[1,0]= [7 8 9]

# 2.切片,第1行到第2行
print("a[1:3]=",a[1:3])
# a[1:3]= [[[ 7  8  9]
#  [10 11 12]]]

# 3.索引和切片结合,第1行到第2行的第2列
print("a[0:2,1]=",a[0:2,1])
# a[0:2,1]= [[ 4  5  6]
#  [10 11 12]]

# 4.索引和切片结合,第1行到第2行的第1列到第2列
print("a[0:2,0:2]=",a[0:2,0:2])
# a[0:2,0:2]= [[[ 1  2  3]
#   [ 4  5  6]]

#  [[ 7  8  9]
#  [10 11 12]]]

5.数组形状改变

  • 对象.reshape()
    • 没有进行行列互换,新产生一个ndarray
a = np.array([[1,2],[3,4]])
b = a.reshape([1,4])
# a=array([[1,2],[3,4]])
# b=array([[1,2,3,4]])
  • 对象.resize()
    • 没有进行行列互换,修改数组本身的形状(需要保持元素个数前后相同)
a = np.array([[1,2,3],[4,5,6]])
a.resize([3,2])
a
# array([[1, 2],
#        [3, 4],
#        [5, 6]])
a = np.array([[1,2],[3,4]])
a.resize([1,4])
a
# array([[1, 2, 3, 4]])
  • 对象.T
    • 进行了行列互换
a = np.array([1,2,3],[4,5,6])
a.T
# array([[1, 4],
#        [2, 5],
#        [3, 6]])
# 查看数组维度
a.shape
# (2, 3)即2行3列
a.T.shape
# (3, 2)即3行2列

6.数组合并去重

即将数组所有元素进行合并并去重

a=np.array([[1,2],[2,3],[3,4]])
np.unique(a)
# array([1, 2, 3, 4])

7.ndarray运算

(1)逻辑运算
  • 直接进行大于,小于的判断
  • 合适之后,可以直接进行赋值
a=np.array([1,3,5,7,9,2,4,6,8])
# 逻辑判断,判断是否大于5
a>5
# array([False, False, False,  True,  True, False, False,  True,  True])

# BOOL赋值, 将满足条件的设置为指定的值-布尔索引
a[a>5]=0
a
# array([1, 3, 5, 0, 0, 2, 4, 0, 0])
(2)判断函数
  • np.all():判断所有元素是否成立

  • np.any():判断是否有任意元素成立

a=np.array([1,3,5,7,9,2,4,6,8])
np.all(a>5)
# False
np.any(a>5)
# True
(3)三元运算np.where

当遇到复杂的运算时,可以使用np.where进行运算。复合逻辑需要结合np.logical_andnp.logical_or使用

a=np.array([1,3,5,7,9,2,4,6,8])
# 1.判断所有元素是否大于5,若大于则设置为1,否则设置为0
np.where(a>5,1,0)
# array([0, 0, 0, 1, 1, 0, 0, 1, 1])
# 2.判断所有元素是否大于5并且小于7,若成立则设置为1,否则设置为0
np.where(np.logical_and(a>5,a<7),1,0)
# array([0, 0, 0, 0, 0, 0, 0, 1, 0])
# 3.判断所有元素是否小于5或大于7,若成立则设置为1,否则设置为0
np.where(np.logical_or(a<5,a>7),1,0)
array([1, 1, 0, 0, 1, 1, 1, 0, 1])
(4)统计运算
  • np.max()最大值
  • np.min()最小值
  • np.median()中位数
  • np.mean()算术平均值
  • np.std()标准差是一组数据平均值分散程度的一种度量。
  • np.var()方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,即 mean((x - x.mean())** 2)
  • np.ptp():计算数组中元素最大值与最小值的差(最大值 - 最小值)。
  • np.argmax(axis=)最大元素对应的下标
  • np.argmin(axis=) 最小元素对应的下标

8.数组与数,数组与数组

a=[1,2]
a+1
# 报错,因为列表只能连接列表
a=np.array([1,2])
a+1
# [2,3] # 是值的相加
a=[1,2]
b=[2]
a+b
# [1, 2, 2] # 是数组(列表)的拼接
a=np.array([1,2])
b=np.array([2])
a+b
# array([3, 4]) # 是值的相加
a=np.array([1,2])
b=np.array([2,3])
a+b
# array([3, 5]) # 是值的相加
NumPy 广播(Broadcast)

在np.array数组中,当参与运算的数组形状(shape)不同时,会将它们进行扩展,使得shape相同,再进行运算。

如下图:

Numpy数组和矩阵

9.线性代数

NumPy 提供了线性代数函数库 linalg,该库包含了线性代数所需的所有功能

函数 描述
dot 两个数组的点积,即元素对应相乘。
vdot 两个向量的点积
inner 两个数组的内积
matmul 两个数组的矩阵积
determinant 数组的行列式
solve 求解线性矩阵方程
inv 计算矩阵的乘法逆矩阵
a=np.array([[1,2],[3,4]])
b=np.array([2,2])
np.dot(a,b)
# array([ 6, 14])
np.matmul(a,b)
# array([ 6, 14])

注意:二者都是矩阵乘法。 np.matmul中禁止矩阵与标量的乘法。 在矢量乘矢量的內积运算中,np.matmul与np.dot没有区别
,即元素对应相乘。 |
| vdot | 两个向量的点积 |
| inner | 两个数组的内积 |
| matmul | 两个数组的矩阵积 |
| determinant | 数组的行列式 |
| solve | 求解线性矩阵方程 |
| inv | 计算矩阵的乘法逆矩阵 |

a=np.array([[1,2],[3,4]])
b=np.array([2,2])
np.dot(a,b)
# array([ 6, 14])
np.matmul(a,b)
# array([ 6, 14])

注意:二者都是矩阵乘法。 np.matmul中禁止矩阵与标量的乘法。 在矢量乘矢量的內积运算中,np.matmul与np.dot没有区别文章来源地址https://www.toymoban.com/news/detail-400631.html

到了这里,关于Numpy数组和矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python】数据科学工具(Numpy Pandas np.array() 创建访问数组 向量与矩阵 Series DataFrame)

    1.Numpy numpy是Python中一个非常重要的科学计算库,其最基础的功能就是N维数组对象——ndarray。 1.1 数组的创建 1)np.array() 用 np.array() 函数可以将Python的序列对象(如列表、元组)转换为ndarray数组。 2)arange、linspace、logspace np.arange(start, stop, step) :创建一个一维数组,其中的值

    2024年02月10日
    浏览(48)
  • Numpy简易教程5——创建NumPy矩阵

    NumPy 对于多维数组的运算,默认情况下并不进行矩阵运算。如果需要对数组进行矩阵运算,则可以调用相应的函数。 在 NumPy 中,矩阵是 ndarray 的子类。 在 NumPy 中,数组和矩阵有着重要的区别。NumPy提供了两个基本的对象: 一个N维数组对象和一个通用函数对象 。其他对象都

    2023年04月08日
    浏览(33)
  • NumPy和Pandas库的基本用法,用于数据处理和分析

    当涉及到数据处理和分析时,NumPy和Pandas是两个非常常用的Python库。下面是它们的基本用法: NumPy(Numerical Python): 导入NumPy库:在代码中使用import numpy as np导入NumPy库。 创建NumPy数组:使用np.array()函数可以创建一个NumPy数组。例如,arr = np.array([1, 2, 3, 4, 5])创建一个包含整数

    2024年02月11日
    浏览(43)
  • Numpy-改变数组维度_数组的拼接

    处理数组的一项重要工 作就是改变数组的维度,包含提高数组的维度和降低数组的维度,还包括数组的转置Numpy 提供的大量API可以很轻松地完成这些数组的操作。 例如,通过 reshape 方法可以将一维数组变成二维、三维或者多维数组。 通过 ravel 方法或 flatten 方法可以将多维数

    2024年02月15日
    浏览(42)
  • 系统学习Numpy(一)——numpy的安装与基础入门[向量、矩阵]

    numpy的安装与基础入门[向量、矩阵与维度] numpy是科学计算以及机器学习深度学习的基础必备工具,本文将介绍numpy的安装,以及关于向量、矩阵相关的基础知识。 在conda下使用 conda install numpy 安装。 如果没有conda可以使用 pip install numpy 安装。 我们将使用 import numpy as np 对nu

    2024年02月16日
    浏览(34)
  • 【numpy基础】--数组简介

    NumPy (Numerical Python)是一个 Python 库,主要用于高效地处理多维数组和矩阵计算。它是科学计算领域中使用最广泛的一个库。 在 NumPy 中, 数组 是最核心的概念,用于存储和操作数据。 NumPy 数组是一种多维数组对象,可以存储相同类型的元素,它支持高效的数学运算和线性

    2024年02月09日
    浏览(59)
  • NumPy数组基本用法

    Numpy是Python科学计算库,用于快速处理任意维度的数组。 NumPy提供一个N维数组类型ndarray,它描述了相同类型的“items”的集合。 numpy.ndarray支持向量化运算。 NumPy使用c语言写的,底部解除了GIL,其对数组的操作速度不在受python解释器限制。 python一个列表中可以存储多种数据类

    2024年02月09日
    浏览(45)
  • Numpy 数组切片

    1.1、切片原理 列表切片是从原始列表中提取列表的一部分的过程。在列表切片中,我们将根据所需内容(如,从何处开始,结束以及增量进行切片)剪切列表。Python中符合序列的有序序列都支持切片(slice),例如列表,字符串,元组。 规则: 1.2、切片使用 1.2.1、获取列表

    2023年04月19日
    浏览(47)
  • 【numpy基础】--数组排序

    numpy 数组通常是用于数值计算的多维数组,而排序功能可以快速、准确地对数据进行排序,从而得到更加清晰、易于分析的结果。 在数据分析和处理过程中,常常需要对数据进行排序,以便更好地理解和发现其中的规律和趋势。 排序会应用在很多场景中,比如: 数据分类:

    2024年02月11日
    浏览(35)
  • numpy中数组的操作

    目录 一:数组的属性 二:翻转数组 三:数组的计算 一:数组的属性 NumPy 数组(通常称为 ndarray)有许多有用的属性,这些属性可以帮助你了解数组的各个方面。以下是一些主要的属性: dtype:这是数组的数据类型,如 int32, float64, complex128 等。你可以使用它来查看或修改数

    2024年01月20日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包