Python库-numpy详解

article/2025/9/10 8:42:40

Python库-numpy详解

  • 1. ndarray介绍
  • 2. ndarray的基本操作
    • 生成数组
    • 数组索引、切片
    • 修改数组形状
    • 修改数组类型
    • 数组去重
    • 删除元素
  • 3. ndarray运算
    • 逻辑运算
    • 通用判断函数
    • 三元运算符
    • 统计运算
    • 数组运算
  • 4. matrix 矩阵介绍
  • 5. Python中矩阵运算
  • 扩展:正态分布简介
    • 正态分布图
    • 方差

numpy 库是 一个科学计算库, 使用方法:import numpy as np

  • 用于快速处理任意维度的数组,存储的对象是ndarray
  • 用于矩阵运算,存储的对象是matrix

1. ndarray介绍

1. ndarray的属性

item = np.array([[1, 2], [3, 4], [5, 6]])
# ndarray的属性
print('shape 表示数组维度的元组', item.shape)  # (3, 2)
print('ndim 表示数组维数', item.ndim)  # 2
print('size 表示数组中元素个数', item.size)  # 6
print('itemsize 表示一个元素所占字节大小', item.itemsize)  # 4
print('dtype 表示数字元素的类型', item.dtype)  # int32

2. ndarray的形状

ndarray可以是任意维度的数组

# ndarray的形状
a1 = np.array([1, 2])
a2 = np.array([[1, 2], [3, 4]])
a3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print('a1是{0}维数组'.format(a1.ndim))
print('a2是{0}维数组'.format(a2.ndim))
print('a3是{0}维数组'.format(a3.ndim))
# a1是1维数组
# a2是2维数组
# a3是3维数组

3. ndarray的类型

创建ndarray对象时,可以使用dtype参数指定ndarray的类型

# ndarray的类型
item = np.array([[1, 2], [3, 4]], dtype=np.str_)	# 设置类型为字符串
print(item)
#[['1' '2']
# ['3' '4']]

2. ndarray的基本操作

生成数组

1. 生成0和1数组

# 生成一个3行4列的数组,元素为0。注意:默认类型为浮点型 0.
arr_zero = np.zeros([3, 4], dtype=int)
# 生成一个3行4列的数组,元素为1
arr_one = np.ones_like(arr_zero)

2. 从现有数组生成

  • array()
a = np.array([[1, 2, 3], [4, 5, 6]])
array = np.array(a)
print(array)
  • asarray()
asarray = np.asarray(a)
print(asarray)
  • array()和asarray()的区别
a[0, 0] = 100   # 修改元素值
print(array)    # array是深拷贝,修改原数据,现数据不变。相当于复制
print(asarray)  # asarray是浅拷贝,修改原数据,现数据改变。相当于创建快捷方式
# [[1 2 3]
#  [4 5 6]]
# [[100   2   3]
#  [  4   5   6]]

3. 生成固定范围的数组

  • linspace(start, stop, num, endpoint) 固定个数,步长相等
# 从0到100,生成11个元素,默认包含stop值100,endpoint=True
arr = np.linspace(0, 100, 11)
print(arr)
# [  0.  10.  20.  30.  40.  50.  60.  70.  80.  90. 100.]
  • arange(start, stop, step, dtype) 固定步长
# 从0到50,固定步长10生成int类型元素,不包括stop值
arr2 = np.arange(0, 50, 10, np.int32)
print(arr2)
# [ 0 10 20 30 40]
  • logspace(start, stop, num) 生成10的N次幂的数据
# 从10^0开始到10^3结束,生成4个元素
arr3 = np.logspace(0, 3, 4)
print(arr3)
# [   1.   10.  100. 1000.]

4. 生成随机数组 np.random模块

4.1. 均匀分布生成

  • rand(d0, d1, … , dn) 返回一个[0.0, 1.0)内的一组均匀分布的数据
a1 = np.random.rand(2, 3)   
print(a1)
  • uniform(low, high, size) 从一个均匀分布[low, high)中随机采样,可替代rand()方法 常用
a2 = np.random.uniform(1, 10, (2, 3))
print(a2)
  • randint(low, high, size) 从一个均匀分布[low, high)中随机采样,生成N维整数数组
a3 = np.random.randint(1, 10, (2, 3))
print(a3)

生成均匀分布数据的小案例

import matplotlib.pyplot as plt# 1.准备数据 在[0,1)范围内生成 100000000 个数据
x = np.random.uniform(0, 1, 100000000)
# 2.画布
plt.figure(figsize=(20,8), dpi=100)
# 3.绘制 x为数据, bins是要划分的区间数
plt.hist(x=x, bins=1000)
# 4.显示
plt.show()

数据分布如图所示:
在这里插入图片描述
4.2. 正态分布生成

  • randn(d0, d1, … , dn) 从标准正态分布中返回一个或多个样本值
a1 = np.random.randn(2, 3)   
print(a1)
  • normal(loc, scale, size) loc均值,scale标准差,默认size=None,返回一个值 常用
a2 = np.random.normal(1.75, 1, (2, 3))
print(a2)
  • standard_normal(size) 返回指定形状的标准正态分布的数组
a3 = np.random.standard_normal((2, 3))
print(a3)

生成正态分布数据的小案例

# 1.准备数据
x = np.random.normal(1.75, 1, 100000000)
# 2.画布
plt.figure(figsize=(20,8), dpi=100)
# 3.绘制 x为数据, bins是要划分的区间数
plt.hist(x=x, bins=1000)
# 4.显示
plt.show()

数据分布如图所示:
在这里插入图片描述

数组索引、切片

  • 直接索引,先对行索引,再对列索引
  • 高维数组索引,从宏观到微观
# 生成一个5行4列的随机数组,范围在40~100
score = np.random.randint(40, 100, (5, 4))
print(score)
# 获取第一行,第三列的值
print(score[0, 2])
# 获取前两行,前三列的值,注意切片是[),左闭右开
print(score[0:2, 0:3])

修改数组形状

  • reshape(shape[,order]) 返回一个新数组,原数组不变,行列顺序不变
# 生成一个4行5列的随机数组,范围在40~100
score = np.random.randint(40, 100, (4, 5))
# 将数组修改为5行4列
a1 = score.reshape([5, 4])
print(a1)
# 若行为-1,表示行不固定,根据列的大小修改,但必须保证列的大小是总数的一个因数,否则会报错
a2 = score.reshape([-1, 10])    # 元素总数为20,[-1, 10]表示 20/10 修改为2行10列
print(a2)
  • resize(shape[,order]) 无返回,改变原数组,行列顺序不变
# 将数组修改为5行4列
score.resize([5, 4])
print(score)
  • T 返回一个新数组,原数组不变,行列顺序改变
print(score.T)

修改数组类型

astype(dtype)

# 生成一个4行5列的随机数组,范围在[1,5) 类型为浮点型
score = np.random.uniform(1, 5, (4, 5))
# 修改数组类型为int
print(score.astype(np.int_))

数组去重

np.unique()

arr = np.array([[1, 2, 3, 4], [3, 4, 5, 6]])
print(np.unique(arr))
# [1 2 3 4 5 6]

删除元素

np.delete(arr,obj,axis)

  • arr:ndarray数组
  • obj:删除元素的位置或者条件
  • axis:指定删除行或者列

3. ndarray运算

逻辑运算

  • 大于、小于直接进行比较
  • bool赋值,通过布尔索引进行赋值
arr = np.random.normal(0.75, 1, (3, 4))
print(arr)
# 逻辑判断 如果值大于0,标记为True,否则为False
print(arr > 0)  # 大于、小于 直接进行比较
# bool赋值,通过布尔索引进行赋值
arr[arr > 0] = 2    # 将大于0的元素赋值为2
print(arr)
# [[ 1.61640357 -0.21286798  0.67147044  1.07099177]
#  [ 0.87844707 -0.30592255  2.51825124 -0.53368643]
#  [ 0.85427772 -1.21688459 -0.81051012  0.77601911]]
# [[ True False  True  True]
#  [ True False  True False]
#  [ True False False  True]]
# [[ 2.         -0.21286798  2.          2.        ]
#  [ 2.         -0.30592255  2.         -0.53368643]
#  [ 2.         -1.21688459 -0.81051012  2.        ]]

通用判断函数

  • np.all() 所有元素都满足才会返回True
  • np.any() 任何一个元素满足都会返回True
# 通用判断函数
arr = np.random.normal(0.75, 1, (3, 4))
print(arr)
# np.all()  所有元素都满足才会返回True
print(np.all(arr > 0))
# np.any()  任何一个元素满足都会返回True
print(np.any(arr > 0))# [[ 2.96745424  1.13869564  2.42304826  1.00264569]
#  [ 1.09160352  1.67433992  0.80692908  0.87226686]
#  [-0.11395954 -0.10808592  2.67034408  1.06746313]]
# False
# True

三元运算符

  • np.where(表达式, value1, value2) 表达式为True,执行value1, 否则执行value2
  • 复合逻辑需要结合 np.logical_and() 或 np.logical_or() 使用
# 三元运算符
arr = np.random.normal(0.75, 1, (3, 4))
print(arr)
# np.where(表达式, value1, value2)     表达式为True,执行value1, 否则执行value2
print(np.where(arr > 0, 1, 0))
# 复合逻辑需要结合 np.logical_and() 或 np.logical_or() 使用
print(np.where(np.logical_and(arr > 0.5, arr < 1), 1, 0))   # 大于0.5并且小于1
print(np.where(np.logical_or(arr > 0.5, arr < -0.5), 1, 0))   # 大于0.5或者小于-0.5
# [[-0.55217725  1.50314214  0.35100255  1.76121231]
#  [-0.47892572  1.7304177   1.19885493  0.28415964]
#  [ 0.83477297  0.76201994  0.40926624  0.95691155]]
# [[0 1 1 1]
#  [0 1 1 1]
#  [1 1 1 1]]
# [[0 0 0 0]
#  [0 0 0 0]
#  [1 1 0 1]]
# [[1 1 0 1]
#  [0 1 1 0]
#  [1 1 0 1]]

统计运算

  • min() 最小值
  • max() 最大值
  • mean() 均值
  • std() 标准差
  • var() 方差
  • argmin() 最小值的下标
  • argmax() 最大值的下标

统计时,还可以指定统计轴axis(行或者列),在每个轴上进行统计, axis轴的取值并不固定,在本例中,axis 0表示列,1表示行

arr = np.random.normal(0.75, 1, (3, 4))
print(arr)
print(np.max(arr))  # 最大值
print(np.max(arr, axis=1))  # 每行的最大值
# [[ 0.25961034  0.56145924  0.71150806 -0.17447214]
#  [ 0.70701591 -0.16176053  0.24923484  0.48678436]
#  [ 1.21328659 -0.15891988  1.69161668  1.42672955]]
# 1.6916166794484437
# [0.71150806 0.70701591 1.69161668]

数组运算

数组与标量运算

  • 对应元素直接进行运算
arr = np.array([1, 0, 5])
print(arr)
print(arr + 2)
print(arr * 2)
# [1 0 5]
# [3 2 7]
# [ 2  0 10]

数组与数组运算

  • 数组之间的运算需要满足广播机制才可以运算,两个条件
    • 维度相等
    • shape(其中相对应的一个地方为1)

条件可以表示为:

可以运算:
A       (3d array): 5 x 4 x 7
B       (3d array): 5 x 1 x 1
Result  (3d array): 5 x 4 x 7A       (4d array): 9 x 1 x 7 x 1
B       (3d array):     8 x 1 x 5
Result  (4d array): 9 x 8 x 7 x 5A       (2d array): 5 x 4
B       (1d array):     1
Result  (2d array): 5 x 4不可以运算:
A       (1d array): 10
B       (1d array): 12
A       (2d array): 2 x 1
B       (3d array): 4 x 3 x 2
arr = np.array([1, 0, 5])
arr2 = np.array([2, 1, 1, 4])
print(arr + arr2)
# ValueError: operands could not be broadcast together with shapes (3,) (4,)a = np.array([[1, 2, 3, 2, 1, 4]])  # A         (2d array):     1 x 6
b = np.array([[[1], [3], [4]]])     # B         (3d array): 1 x 3 x 1# Result    (3d array): 1 x 3 x 6
print(a + b , '新数组的shade是{}'.format((a+b).shape))
# [[[2 3 4 3 2 5]
#   [4 5 6 5 4 7]
#   [5 6 7 6 5 8]]] 新数组的shade是(1, 3, 6)

4. matrix 矩阵介绍

矩阵和向量

  • 矩阵(matrix),和数组的区别:矩阵只能是二维的,数组可以是多维的
    A = [ 1 2 3 4 5 6 ] 这是个3 × 2的矩阵,即3行2列  A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix} \text {这是个3 × 2的矩阵,即3行2列} \ A=135246这是个3 × 2的矩阵,即32 
  • 向量:向量是一种特殊的矩阵,一般都是列向量
    B = [ 1 0 4 ] B = \begin{bmatrix} 1 \\ 0 \\ 4 \end{bmatrix} \ B=104 

加法和常量乘法

  • 矩阵的加法:行列数相等才能相加
    在这里插入图片描述
  • 矩阵的常量乘法:每个元素都要乘
    3 × [ 1 2 3 4 5 6 ] = [ 3 6 9 12 15 18 ] 3× \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix} = \begin{bmatrix} 3 & 6 \\ 9 & 12 \\ 15 & 18 \end{bmatrix} \ 3×135246=391561218 

矩阵间的乘法

  • 两个矩阵相乘,只有第一个矩阵的列数等于第二个矩阵的行数才能相乘,即:(M行,N列) × (N行,L列) = (M行,L列)
    在这里插入图片描述
  • 矩阵乘法的性质
    • (1) 结合律: (AB)C=A(BC)
    • (2) 分配律:(左分配律)C(A+B)=CA+CB
              (右分配律)(A+B)C=AC+BC
    • (3) 对常量的结合性:k(AB)=(kA)B=A(kB)

单位矩阵

  • 从左上角到右下角的对角线均为1,其余元素都为0的矩阵

逆矩阵

  • 矩阵A × 矩阵B = 单位矩阵,则A和B互为逆矩阵

转置矩阵

  • 行和列互换的矩阵

5. Python中矩阵运算

  • np.matmul() 两个矩阵相乘
  • np.dot() 两个矩阵相乘或者矩阵与标量相乘
arr1 = np.random.randint(1, 7, (3, 2)) # 3 x 2 矩阵
arr2 = np.random.randint(2, 5, (2, 4)) # 2 x 4 矩阵
print(arr1)
print(arr2)
print(np.matmul(arr1, arr2))  # 结果为 3 x 4 矩阵
# print(np.dot(arr1, arr2))# np.dot() 支持与标量相乘
print(np.dot(arr1, 5))  # 结果为 3 x 2 矩阵
# [[6 5]
#  [2 1]
#  [5 1]]
# [[2 2 3 4]
#  [4 2 3 2]]
# [[32 22 33 34]
#  [ 8  6  9 10]
#  [14 12 18 22]]
# [[30 25]
#  [10  5]
#  [25  5]]

扩展:正态分布简介

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

正态分布图

在这里插入图片描述

  • 均值:图形的左右位置
  • 方差:图形是瘦还是胖
    • 方差越小,图形越瘦高,数据越集中
    • 方差越大,图形越矮胖,数据越分散

方差

  • 方差是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。
  • s 2 = ∑ i = 1 n ( x i − x ˉ ) 2 n , x i 表 示 样 本 数 据 , x ˉ 表 示 样 本 数 据 平 均 值 , n 表 示 样 本 总 个 数 s^2 = \frac{\sum_{i=1}^n (x_i-\bar{x})^2}{n} {,x_i表示样本数据,\bar{x}表示样本数据平均值,n表示样本总个数} s2=ni=1n(xixˉ)2xixˉn

http://chatgpt.dhexx.cn/article/cciLJga4.shtml

相关文章

python numpy库

文章目录 NumPy( Numeric Python)numpy的引用Ndarray引入n维数组的意义ndarray的组成ndarray对象的属性 数据类型ndarray支持多种数据类型的原因ndarray数组的创建adarray数组的变换ndarray数组运算 索引与切片随机数函数统计函数梯度函数副本与视图numpy线性代数数组与标量之间…

python-numpy库

目录 ndarray对象 arange函数 array函数 random函数 其他创建数组方法 切片和索引及修改数组维度 数组的拼接 数组的分割 数组的转置 数组的运算 numpy(Numerical Python)是科学计算基础库&#xff0c;提供大量科学计算相关功能&#xff0c;比如数据统计&#xff0c;…

Python中的numpy库介绍!

机器学习算法中大部分都是调用Numpy库来完成基础数值计算的。 安装方法&#xff1a; pip3 install numpy1. ndarray数组基础 python中用列表保存一组值&#xff0c;可将列表当数组使用。另外&#xff0c;python中有array模块&#xff0c;但它不支持多维数组&#xff0c;无论是…

NumPy库的介绍与使用(一)

目录 一、NumPy库简介二、NumPy库入门1.数据的维度2.安装NumPy3.导入NumPy库 三、NumPy的数组对象&#xff1a;ndarray1 为什么要引入ndarry呢&#xff1f;2. ndarray是一个多维数组对象2.1 定义2.2 内存中的存储形式2.3 ndarray对象的属性2.4 ndarray数组的元素类型 3. ndarra…

Numpy库的介绍及使用

Numpy库的介绍及使用 1. Numpy库入门1.1 数据的维度1.2 ndarray的优势1.3 ndarray对象的属性1.4 ndarray数组的创建和变换1.4.1 ndarray数组的创建方法1.4.2 ndarray数组维度的变换 1.5 ndarray数组的索引和切片1.6 ndarray数组的运算 2. 数据存取与函数2.1 CSV存取数据2.2 多维…

numpy库的安装方法

安装numpy库的方法 winR&#xff0c;输入cmd&#xff0c;打开cmd 在cmd中输入pip install numpy&#xff0c;回车 输入pip list&#xff0c;查看numpy是否安装成功 4.在cmd中输入python&#xff0c;回车&#xff0c;在输入import numpy&#xff0c; 验证numpy库是否可以被调…

Numpy库的安装

Numpy库的安装 一、numpy简介 NumPy是一个功能强大的Python库&#xff0c;主要用于对多维数组执行计算。NumPy提供了大量的库函数和操作&#xff0c;可以帮助程序员轻松地进行数值计算。这类数值计算广泛用于以下任务&#xff1a; **机器学习模型&#xff1a;**在编写机器学…

numpy库的一些解释

Numpy库介绍 NumPy是一个的Python库&#xff0c;主要用于对多维数组执行计算。 NumPy这个词来源于两个单词-- Numerical [njuːˈmerɪkl] &#xff08;数值;数值法;数值的;数字的&#xff09;和 Python。主要用来进行数值计算。 有以下几个特点: 1.numpy内置了并行运算功能&a…

Numpy库

Numpy库入门 一维数据&#xff1a;由对等关系的有序或无序数据构成&#xff0c;采用线性方式组织。 二维数据由多个一维数据构成&#xff0c;是一维数据的组合形式。&#xff08;表格&#xff09; 多维数据由一维或二维数据在新维度上扩展形成。 Numpy:开源的Python科学计算…

Python Numpy库的超详细介绍

Numpy库是Python中的一个科学计算库,本文主要介绍了ndarray的基本操作、 ndarray运算等各种Numpy库的超详细教程,需要的朋友可以参考下 1、Numpy概述 1.1 概念 Python本身含有列表和数组&#xff0c;但对于大数据来说&#xff0c;这些结构是有很多不足的。由于列表的元素可以…

python进阶--Numyp库(一)

一、Numpy库介绍 NumPy&#xff08;Numerical Python&#xff09;是Python的⼀种开源的数值计算扩展。提供多维数组对象&#xff0c;各种派⽣对象&#xff08;如掩码数组和矩阵&#xff09;&#xff0c;这种⼯具可⽤来存储和处理⼤型矩阵&#xff0c;⽐Python⾃身的嵌套列表&am…

解决端口8080被占用的问题!

今天在回顾cms项目的时候发现怎么都启动不了&#xff0c;看见左下角报错 原来是8080端口被别的进程占用了。 解决方法&#xff1a;winr cmd 回车 在命令窗口中 输入netstat -ano就可以查看所有端口显示的状态信息 找到这个本地地址是0.0.0.0:8080最后面的PID&#xff0c;就是…

8080端口被占用怎么办

做项目时肯定会遇到8080端口被占用的情况&#xff0c;其实解决办法很简单&#xff1a; CtrlR键&#xff0c;输入cmd: 复制这串代码到cmd界面&#xff1a; netstat -aon|findstr "8080" 可以看到8080确实被占用了&#xff1a; 把后面的都终止掉&#xff…

解决localhost:8080被占用

解决方法如下&#xff1a; 1.以管理员方式打开CMD&#xff0c;我的电脑——c盘——windows——system32——CMD.exe——右键管理员身份打开 1.在cmd里输入netstat -ano|findstr 8080&#xff0c;查看是哪个进程占用了8080端口。 2.输入taskkill /pid 11904 /f&#xff0c;结束…

解决SpringBoot默认Tomcat端口号8080被占用

问题描述&#xff1a; 打开Eclipse后启动SpringBoot项目&#xff0c;发现8080端口被占用。然后寻找Eclipse是否有未关闭的Tomcat项目&#xff0c;发现并没有&#xff0c;重启Eclipse仍然会出现端口占用的请况。 给出的错误信息显示。 Description: The Tomcat connector co…

解决tomcat端口8080被占用

1、eclipse启动tomcat时8080端口被占用&#xff1a; 2、打开CMD&#xff1a; 命令查找正在使用8080端口的进程&#xff0c; netstat -ano|findstr 8080 杀死该进程&#xff0c; taskkill /pid 117800 /f 命令说明&#xff1a;taskkill /pid 117800&#xff08;进程id号&am…

idea报8080端口被占用解决

1错误提示 Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port. 2原因 这是因为我们某个程序占用了8080端口&#xff0c;有可能是我们以前某个项目没有正确暂停导致。 3解决 1&#xff1a;打开cmd窗…

Tomcat 8080 端口被占用解决方案

1. 报错记录 原因&#xff1a;端口号8080被其他应用程序占用 2. 解决方案 方案一&#xff1a;结束占用端口程序 在Windows控制台中输入下面内容查询占用8080端口的进程id netstat -ano|findstr "8080" ctrlshiftesc打开任务管理器&#xff0c;在服务通过pid找到占用程…

解决8080端口号被占用问题

在使用TomCat时偶尔会出现8080端口被占用的提示&#xff0c;为此总结出如下解决方法&#xff1a; 1.以管理员身份打开命令提示符 2.输入netstat -ano|findstr "8080" 3. 上图最右边的6636、3280、6636为进程id,接下来就要结束这些进程 4.输入taskkill /f /pid 663…

解决windows系统下8080端口被占用

1.winR&#xff1a;输入cmd&#xff0c;回车 输入指令&#xff1a;netstat -ano | findstr 8080 指令的意思是找出占用8080端口的进程pid 2. 此时找到8080端口号的pid是11660&#xff08;pid是会变化的&#xff09; 终止进程 释放端口 输入指令&#xff1a;taskkill …