Python的NumPy数组
NumPy 是 Python 中科学计算的基础包,他是一个 Python 库,提供多维数组对象,各种派生对象:比如掩码数组和矩阵,以及用于数组快速操作的各种 API,包括数学,逻辑、形状操作、排序、选择、输入输出、离散傅里叶变换、基本线性代数、基本统计运算和随机模拟等等。
NumPy 包的核心是ndarray 对象。它封装了 Python 原生的同数据类型的 n 维数组,为了保证其性能优良,其中有许多操作都是代码在本地进行编译后执行的。NumPy 数组和原生 python Array(数组)之间的区别如下。
- NumPy 数组在创建时具有固定的大小,与 python 的原生数组对象不同。更改 ndarray 的大小将创建一个新数组并删除原来的数组。
- NumPy 数组中的元素都需要具有相同的数据类型,因此内存中的大小相同
- NumPy 数组有助于对大量数据进行高级数学和其他类型的操作。通常这些操作的执行效率更高,比使用 python 原生数组的代码更少。
NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。
- SciPy 是一个开源的 Python 算法库和数学工具包。
- SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。
- Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)。
1. 数组的创建和概念
1.1 数组的概念
NumPy 的主要对象是同构多维数组。它是一个元素表,所有类型都相同,由非负整数元组索引,在 NumPy 中维度称为轴,如:[[1,2,3],[4,5,6]]有两个轴,第一轴长度为 2,第二轴长度为 3,可以将第一轴看成 x 轴,第二轴看成 y 轴。
1.2 数组的创建
1.2.1 np.array () 类型转换函数
可以把列表和元组等序列转换 ndarray
import numpy as np
print("方法一:使用列表和元组")
arr1 = np.array([[1,2,3],[4,5,6]])
print("arr1 =%s"%arr1)
print("arr1 of type is:%s"%type(arr1))
1.2.2 特殊数组创建
print("方法二:使用np的函数创建特殊数组")
arr2 = np.zeros(shape=(2,3),dtype=np.int16)
print("arr2 =%s"%arr2)
print("arr2 of type is:%s"%type(arr2))
arr3 = np.ones((2,5))
print("arr3 =%s"%arr3)
arr4 = np.empty((3,5))
print("arr4 =%s"%arr4)
arr5 = np.eye(3)
print("arr5 =%s"%arr5)
NumPy 提供了几个函数来创建具有初始占位符内容的数组。这就减少了数组增长的必要,因为数组增长的操作花费较大。
- zeros ():创建一个由 0 组成的数组
- ones ():创建一个全为 1 的数组
- empty ():创建一个数组,内容是随机的,取决于内存的状态
- eye ():用于创建单位矩阵
默认情况下,创建数组的 dtype 是 float64 类型的,创建的时候可以用 dtype 参数指定数据类型。
1.2.3 np.full () 函数创建指定值数组
print("方法三:使用full函数")
arr6 = np.full((2,6),100,dtype=np.int16)
# arr6 = np.full((2,6),100)
print(arr6)
1.2.4 np.arange () 函数创建一维数组
print("方法四:使用np.arange()函数")
print('numpy version=',np.__version__)
arr7 = np.arange(12,20)
print(arr7)
1.2.5 np.linspace () 函数创建指定间隔的数组
print("方法五:创建等间隔一维数组")
arr8 = np.linspace(0,5,6)
print(arr8)
arr9 = np.linspace(0,np.pi*2.5)
# 把[0,2pi]均分4份,也就是五个点,算两个端点
print(arr9)
1.2.6 numpy 随机数生成数组
print("方法六:随机数生产")
rand = np.random.RandomState(30)
arr10 = rand.randint(10,50,size=(3,5))
arr11 = np.arange(10)
print("arr11 = ",arr11)
2. 数组的属性(核心必看)
学习 NumPy,可访问以下网址:numpy 中文:http://www.numpy.org.cn/reference/routines/random.htmlnumpy 英文:https://numpy.org/learn/
数组属性可以快速查看数组的维度、形状、数据类型、元素个数等,是 NumPy 最基础的知识点。
2.1 常用属性演示
import numpy as np
# 创建二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 1. 数组维度(轴的数量)
print("数组维度 ndim:", arr.ndim)
# 2. 数组形状(几行几列)
print("数组形状 shape:", arr.shape)
# 3. 数组元素数据类型
print("数据类型 dtype:", arr.dtype)
# 4. 数组总元素个数
print("总元素个数 size:", arr.size)
# 5. 每个元素占用字节数
print("单元素字节 itemsize:", arr.itemsize)
# 6. 数组总占用内存
print("总字节数 nbytes:", arr.nbytes)
2.2 属性总结表
| 属性名 | 作用 |
|---|---|
| ndarray.ndim | 数组的维度(轴数) |
| ndarray.shape | 数组形状,返回元组,如 (3,3) |
| ndarray.dtype | 数组元素的数据类型 |
| ndarray.size | 数组总元素数量 |
| ndarray.itemsize | 单个元素占用字节数 |
| ndarray.nbytes | 数组总占用内存大小 |
3. 数组的索引与切片(取值必备)
3.1 一维数组索引
import numpy as np
a = np.array([10, 20, 30, 40, 50])
# 正索引
print(a[0]) # 10
print(a[2]) # 30
# 负索引(倒数)
print(a[-1]) # 50
print(a[-2]) # 40
3.2 二维数组索引
b = np.array([[1,2,3], [4,5,6], [7,8,9]])
# 取单个元素:数组[行, 列]
print(b[1, 2]) # 第1行第2列 → 6
# 取整行
print(b[0]) # 第0行 [1 2 3]
# 取整列
print(b[:, 1]) # 第1列 [2 5 8]
3.3 数组切片
格式:数组[起始:结束:步长],口诀:左闭右开
a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
print(a[2:7]) # [2 3 4 5 6]
print(a[:5]) # 前5个元素
print(a[::2]) # 步长为2,取偶数位
print(a[::-1]) # 数组反转
3.4 布尔索引(条件筛选)
x = np.array([1, 2, 3, 4, 5, 6])
# 筛选大于3的元素
print(x[x > 3]) # [4 5 6]
# 多条件筛选
print(x[(x > 2) & (x < 6)]) # [3 4 5]
4. 数组的形状操作
4.1 reshape () 修改形状
要求:总元素数量不变
a = np.arange(12) # 一维数组
b = a.reshape(3, 4) # 转为3行4列二维数组
print(b)
4.2 ravel () /flatten () 展平数组
# 二维转一维
arr = np.array([[1,2],[3,4]])
print(arr.flatten()) # [1 2 3 4]
4.3 数组转置
a = np.arange(6).reshape(2,3)
print(a.T) # 转置,行列互换
4.4 数组拼接与拆分
4.4.1 数组拼接
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
# 垂直拼接(上下)
c = np.vstack((a, b))
# 水平拼接(左右)
d = np.hstack((a, b))
4.4.2 数组拆分
x = np.arange(12).reshape(3,4)
# 垂直拆分
np.vsplit(x, 3)
# 水平拆分
np.hsplit(x, 2)
5. 数组的数学运算
5.1 逐元素运算
a = np.array([1,2,3])
b = np.array([4,5,6])
print(a + b) # 加法 [5 7 9]
print(a - b) # 减法
print(a * b) # 乘法
print(a / b) # 除法
print(a ** 2) # 平方
5.2 广播运算(数组 + 标量)
a = np.array([1,2,3])
print(a + 10) # [11 12 13]
print(a * 2) # [2 4 6]
5.3 常用数学函数
x = np.array([1,2,3,4])
print(np.sum(x)) # 求和
print(np.mean(x)) # 平均值
print(np.max(x)) # 最大值
print(np.min(x)) # 最小值
print(np.std(x)) # 标准差
print(np.sqrt(x)) # 开平方
print(np.exp(x)) # 指数
5.4 矩阵运算
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
# 矩阵乘法
print(np.dot(a, b))
# 矩阵逆
print(np.linalg.inv(a))
6. 数组的排序与查找
6.1 数组排序
a = np.array([3,1,4,2])
a.sort() # 原地排序
print(a) # [1 2 3 4]
6.2 最大值 / 最小值索引
x = np.array([5, 2, 8, 1])
print(np.argmax(x)) # 最大值索引 2
print(np.argmin(x)) # 最小值索引 3
7. 数组的文件读写
7.1 保存数组
arr = np.array([[1,2],[3,4]])
np.save("my_array.npy", arr)
7.2 加载数组
load_arr = np.load("my_array.npy")
print(load_arr)
7.3 保存为 txt 文件
np.savetxt("data.txt", arr, delimiter=",")
8. 随机数生成(常用总结)
# 0~1均匀分布
np.random.rand(2,3)
# 标准正态分布
np.random.randn(2,3)
# 指定范围整数
np.random.randint(0, 10, size=(2,3))
# 随机种子(固定结果)
np.random.seed(10)
📌 总结
- NumPy 核心是ndarray 多维数组,运算速度远超 Python 原生列表
- 数组创建:
array/zeros/ones/arange/linspace/random - 核心属性:
ndim/shape/dtype/size - 核心操作:索引、切片、形状修改、数学运算、拼接拆分
- 适用场景:数据分析、机器学习、科学计算、矩阵运算
本文涵盖 NumPy 最核心的基础知识点,适合零基础入门,建议收藏练习!
更多推荐

所有评论(0)