Numpy是什么?
numpy是Python中科学计算的基础包。
它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。
Numpy能做什么?
numpy的部分功能如下:
- ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组
- 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
- 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
- 线性代数、随机数生成以及傅里叶变换功能。
- 用于集成由C、C++、Fortran等语言编写的代码的API。
Ndarray 的核心特性
- Numpy中的数组
多维性
- 支持0维(标量)、1维(向量)、2维(矩阵)及更高维数组
同质性
- 所有元素类型必须一致(通过dtype指定)
高效性
- 基于练习内存块存储,支持向量化运算
多维性
- 创建0维的ndarray数组
import numpy as np
arr = np.array(5)
# 获取arr的维度;number of dimensions
print(arr.ndim) # 0
- 创建1维的ndarray数组
import numpy as np
arr = np.array([1,2,3])
# 获取arr的维度;number of dimensions
print(arr.ndim) # 1
- 创建二维数组
import numpy as np
arr = np.array([1,2,3],[4,5,6])
# 获取arr的维度;number of dimensions
print(arr.ndim) # 2
同质性
- 不同的数据类型会被强制转换成相同的数据类型
arr = np.array([1,'hello'])
print(arr) # ['1','hello']
原本在数组中1是数值number,在创建后,会被自动转换为字符串
arr = np.array([1,2.22])
print(arr) # [1. 2.22]
浮点数也是一样,number会被转为float浮点数
属性
| 属性 | 说明 | 示例 |
|---|---|---|
| shape | 数组的形状:行数和列数 | arr.shape |
| ndim | 维度数量:数组是几维 | arr.ndim |
| size | 总元素个数:数组中所有元素的总数 | arr.size |
| dtype | 元素类型:数组中元素的类型 | arr.dtype |
| ---------- | --------------------------- | ----------- |
| T | 转置:行列格式互换 | arr.T |
| itemsize | 单个元素占用的内存字节数 | arr.itemsize |
| nbytes | 数组总内存占用量:size*itemsize | arr.nbytes |
| flags | 内存存储方式:是否连续存储(高级优化) | arr.flags |
shape形状
- 0维
arr = np.array(1)
print(arr) # 1
print(arr.shape) # ()
- 一维
arr = np.array([1,2,3])
print(arr) # [1 2 3]
print(arr.shape) # (3,)
- 二维
arr = np.array([1,2,3],[4,5,6])
print(arr) # [[1 2 3] [4 5 6]]
print(arr.shape) # (3,3)
size个数
- 0维
arr = np.array(1)
print(arr) # 1
print(arr.size) # 1
- 一维
arr = np.array([1,2,3])
print(arr) # [1 2 3]
print(arr.size) # 3
- 二维
arr = np.array([1,2,3],[4,5,6])
print(arr) # [[1 2 3] [4 5 6]]
print(arr.size) # 6
dtype数据类型
- 0维
arr = np.array(1)
print(arr) # 1
print(arr.dtype) # int64
- 一维
arr = np.array([1,2.5,3])
print(arr) # [1. 2.5 3.]
print(arr.dtype) # float64
- 二维
arr = np.array([1,2,3],[4,5,6])
print(arr) # [[1 2 3] [4 5 6]]
print(arr.dtype) # int64
T数组转置
- 转置效果在一维和零维数组上体现不出效果,只有在二维或更高维的数组上在能体现
arr = np.array([1,2,3],[4,5,6])
print(arr) # [[1 2 3] [4 5 6]]
print(arr.T) # [[1 4] [2 5] [3 6]]
ndarray 创建
上述都属于基本构造
ndarray还有很多构造方式
| 构造方式 | 说明 |
|---|---|
| 基础构造 | 适用于手动构建小规模数组或复制已有数据 |
| 预定义形状填充 | 用于快速初始化固定形状的数组(如全0占位、全1初始化) |
| 基于数值范围生成 | 生成数值序列,常用于模拟时间序列、坐标网格等 |
| 特殊矩阵生成 | 数学运算专用(如线性代数中的单位矩阵) |
| 随机数组生成 | 模拟实验数据、初始化神经网络权重等场景 |
| 高级构造方法 | 处理非结构化数据(如文件、字符串)或通过函数生成复杂数组 |
- 函数生成列举
| 用途 | 方法 | |||
|---|---|---|---|---|
| 基础构造 | np.array() | np.copy() | ||
| 预定义形状填充 | np.zeros() | np.ones() | np.empty() | np.full() |
| 基于数值范围生成 | np.arange() | np.linspace() | np.logspace() | |
| 特殊矩阵生成 | np.eye() | np.diag() | ||
| 随机数组生成 | np.random.rand() | np.random.randn() | np.random.randint() | |
| 高级构造方法 | np.array() | np.loadtxt() | np.fromfunction() |
基本构造
np.array()基础创建
list1 = [1,2,3]
arr = np.array(list1)
print(arr.ndim) # 1
print(arr)# [1 3]
.array()还有其他参数,例如指定数组类型,指定数组维度,指定复制对象
np.copy()拷贝
将其他数组拷贝到新数组
# copy
arr1 = np.copy(arr)
print(arr1) #[1. 2. 3.]
- 元素跟原始的数组相同,但是不是一个数组了
预定义形状
np.zeros()预定义形状
arr = np.zeros((2,3),dtype=int)
print(arr)
#[[0 0 0]
# [0 0 0]]
- .zeros()默认创建的是float类型
.ones()全1和.empty()随机
# 全1
arr = np.ones((2,3),dtype=int)
print(arr)
# [[1 1 1] [1 1 1]]
# 空,默认是随机数
arr = np.empty((2,3))
print(arr)
# [[5.e-324 5.e-324 5.e-324]
# [5.e-324 5.e-324 5.e-324]]
.full()填充
- .full()方法可以指定填充的数值
# full 填充
arr = np.full((2,3),666)
print(arr)
#[[666 666 666]
# [666 666 666]]
数值范围生成
.arange(start,end,step)
arr = np.arange(1,10,2) # start,end,step(步长)
print(arr)
# [1 3 5 7 9]
根据步长,生成从start数开始到end数的数组- 数组中不包含end本身,如果要包含建议:end+1
.linspace(start,end,slice)
arr2 = np.linspace(1,10,3) # start,end,slice(间隔)
print(arr2) #[ 1. 5.5 10. ]
- 生成从start到end数的数组,并再这个区间中根据间隔数获得相应的值(等分的)
使用arange()也可以达到相应的效果,但是对数组内个数要求严苛一些
.logspace(start,end,num,base)
对数间隔
- start 开始数值
- end 结束数值
- num 需要取多少个数
- base 以多少为底
# 对数间隔数列
arr = np.logspace(0,4,5,base=2)
print(arr) # [ 1. 2. 4. 8. 16.]
其实这个不难理解,从linspace角度来看
logspace在执行前会先执行linsapce
arr2 = np.linspace(0,4,5)
print(arr2) # [0. 1. 2. 3. 4.]
logspace 会拿这个 linspace 生成的数组去取自身 base 数值的次方
矩阵
| 名称 | 维度 | 示例 | 说明 |
|---|---|---|---|
| 标量 | 零维 | 5,3 | 单个数字,无行列 |
| 向量 | 一维 | [1,2,3] | 只有行或列 |
| 举证 | 二维 | [[1,2,3] [4,5,6]] | 严格的行列结构(二维表) |
| 张量 | >=三维 | [[1,[5,6][[7,[8,9]],4]] | 高阶数组(如RGB图像) |
矩阵是一个由行和列排列成的矩阵数组
$$ A = \begin{bmatrix} 0&1&2\\ 3&4&5\\ 6&7&8\\ \end{bmatrix} $$
形状:这个矩阵有3行3列,记作 2*3矩阵
元素:矩阵中的每个数字称为元素
| 矩阵类型 | 定义 | 例子 |
|---|---|---|
| 零矩阵 | 所有元素为0 | $$\begin{bmatrix} 0&0\\0&0 \end{bmatrix}$$ |
| 单位矩阵 | 对角线上为1,其余为0 | $$\begin{bmatrix} 1&0\\0&1 \end{bmatrix}$$ |
| 对角矩阵 | 只有对角线有非零值 | $$\begin{bmatrix} 2&0\\0&3 \end{bmatrix}$$ |
| 对称矩阵 | $$A=A^T$$ | $$\begin{bmatrix} 1&2\\2&3 \end{bmatrix}$$ |
.eye(行,列)单位矩阵
- 主对角线上的数字为1,其他数字为0
arr = np.eye(3)
print(arr)
#[[1 0 0]
# [0 1 0]
# [0 0 1]]
arr = np.eye(3,5,dtype=int)
print(arr)
#[[1 0 0 0 0]
# [0 1 0 0 0]
# [0 0 1 0 0]]
.diag([])对角矩阵
- 主对角线上非零的0,其他的数字为0
arr = np.diag([1,2,3])
print(arr)
#[[1 0 0]
# [0 2 0]
# [0 0 3]]
方法内传递的是你要在对角线上出现的数字
随机数组的生成
均匀分布
生成0到1之间的随机浮点数(均匀分布)
arr = np.random.rand(2,3)
print(arr)
#[[0.70168642 0.71753434 0.96317388]
# [0.95506805 0.23474415 0.40630574]]
生成指定范围区间的随机浮点数(均匀分布)
arr = np.random.uniform(3,6,(2,3))
print(arr)
#[[5.03622931 4.34216028 5.06781859]
# [4.87780163 5.27826677 4.91474848]]
- .uniform(start,end(row,col))
均匀随机生成一个从start到end范围之间的row行col列的数组
生成指定范围区间的随机整数(均匀分布)
arr = np.random.randint(3,30,(2,3))
print(arr)
#[[16 29 26]
# [29 22 22]]
设置随机种子
np.random.seed(20)
arr = np.random.randint(1,10,(2,5))
print(arr)
#[[4 5 7 8 3]
# [1 7 9 6 4]]
- 种子的作用相当于一个独立的key值,根据key值生成了对应的数组
正态分布
- 正态分布:两边小,中间大
arr = np.random.randn(2,3) # (-3到3之间)
print(arr)
#[[ 1.47105787 -0.50274641 -0.65000031]
# [ 1.6759262 -0.26047681 0.84227465]]
正态分布存在一个峰值,从峰值处,向两端减小和扩大数值,

逐渐向两段扩大和缩小值并不成立倒数关系
ndarray的数据类型
常用的数据有
- 布尔类型 bool
- 整数类型 int uint(无符号整型)
- 浮点数 float
- 复数 complex
arr = np.array([2,0,4],dtype='bool')
print(arr) # [ True False True]
注意,在使用各类数据类型时,还需要考虑到对应的类型能否符合存储要求
arr = np.arange(0,5000,dtype=np.int8)
print(arr) # [ 0 1 2 ... -123 -122 -121]
这里明显已经爆内存了,所以随后数值为负数
不使用int8,改为int16。扩大存储,即可解决问题
arr = np.arange(0,5000,dtype=np.int16)
print(arr)# [ 0 1 2 ... 4997 4998 4999]
或者使用无符号整型
arr = np.arange(0,5000,dtype=np.uint)
print(arr)# [ 0 1 2 ... 4997 4998 4999]
数据类型表格
| 数据类型 | 说明 |
|---|---|
| bool | 布尔类型 |
| int8、uint8 int16、uint16 int32、uint32 int64、uint64 |
有符号、无符号的8位整型 有符号、无符号的16位整型 有符号、无符号的32位整型 有符号、无符号的64位整型 |
| float16 float32 float64 |
半精度浮点型 单精度浮点型 双精度浮点型 |
| complex64 complex128 |
用两个32位浮点数表示的复数 用两个64位浮点数表示的复数 |
💕👉博客专栏
- 新时代语言Python专栏:基础、Anaconda、数据分析三框架(numpy、pandas、matpltlib)
- Golang专栏-包含基础、Gin、Goam等知识
- 云原生专栏-包含k8s、docker等知识
- 从0开始学习云计算-华为HCIP证书
- JUC专栏-带你快速领悟JUC的知识!
- JVM专栏-深入Java虚拟机,理解JVM的原理
- 基于Java研究 数据结构与算法-包含贪心算法、加权图、最短路径算法等知识
- Docker专栏-上手热门容器技术Docker
- SpringBoot专栏-学习SpringBoot快速开发后端
- 项目管理工具的学习-设计技术:Maven、Git、Gradle等相关管理工具
- JavaSE-全面了解Java基础
- JS专栏-使用JS作的一部分实例~
- 使用CSS所作的一部分案例