NumPy(Numerical Python)是Python科学计算的核心库,其核心数据结构是Ndarray(N-dimensional array,多维数组)。Ndarray是一种同质、多维的数组对象,所有元素类型相同,支持高效的向量化运算(无需显式循环),是数据处理、机器学习等领域的基础工具。
![图片[1]_NumPy Ndarray对象:创建与使用指南_知途无界](https://zhituwujie.com/wp-content/uploads/2026/01/d2b5ca33bd20260106095332.png)
一、Ndarray的核心特性
- 同质性:所有元素必须是同一数据类型(如
int、float、str等),由dtype属性指定。 - 多维性:支持1维(向量)、2维(矩阵)、3维(张量)及更高维度。
- 固定大小:创建后形状(
shape)不可变(但可通过reshape调整视图,或通过resize修改原数组)。 - 高效运算:基于C语言实现,支持广播(Broadcasting)和向量化操作,运算速度远超Python列表。
二、Ndarray的创建方法
Ndarray的创建方式多样,可根据数据来源(如列表、文件、随机数等)选择合适的方法。
1. 从Python序列(列表/元组)创建:np.array()
最基础的创建方式,通过numpy.array()将Python列表或元组转换为Ndarray。
语法:
import numpy as np
arr = np.array(sequence, dtype=None) # sequence:列表/元组;dtype:可选,指定数据类型
示例:
# 1维数组(向量)
arr1 = np.array([1, 2, 3, 4]) # dtype默认推断为int64(或int32,取决于系统)
print(arr1) # [1 2 3 4]
print(arr1.dtype) # int64
# 2维数组(矩阵)
arr2 = np.array([[1, 2], [3, 4], [5, 6]]) # 嵌套列表表示二维
print(arr2)
# [[1 2]
# [3 4]
# [5 6]]
print(arr2.shape) # (3, 2):3行2列
# 指定数据类型(如float)
arr3 = np.array([1, 2, 3], dtype=np.float32)
print(arr3) # [1. 2. 3.]
print(arr3.dtype) # float32
2. 创建特殊数组(内置函数)
NumPy提供了快速创建特定数组的函数,适用于初始化或占位场景。
| 函数 | 功能描述 |
|---|---|
np.zeros(shape) | 创建全0数组,shape为元组(如(2,3)表示2行3列)。 |
np.ones(shape) | 创建全1数组。 |
np.empty(shape) | 创建未初始化的随机值数组(速度快,但值为内存残留,慎用)。 |
np.full(shape, val) | 创建全val值的数组(如np.full((2,2), 5)生成2×2的全5数组)。 |
np.arange(start, stop, step) | 类似Python的range,生成等差数组(左闭右开)。 |
np.linspace(start, stop, num) | 生成num个等间隔的数(包含stop,常用于绘图)。 |
np.eye(n) | 创建n×n单位矩阵(对角线为1,其余为0)。 |
np.random模块 | 生成随机数组(如np.random.rand(n)均匀分布,np.random.randn(n)正态分布)。 |
示例:
# 全0数组
zeros_arr = np.zeros((2, 3)) # shape=(2,3)
print(zeros_arr)
# [[0. 0. 0.]
# [0. 0. 0.]]
# 等差数组(arange)
arange_arr = np.arange(0, 10, 2) # start=0, stop=10(不包含), step=2
print(arange_arr) # [0 2 4 6 8]
# 等间隔数组(linspace)
linspace_arr = np.linspace(0, 1, 5) # 0到1之间均匀取5个数(包含1)
print(linspace_arr) # [0. 0.25 0.5 0.75 1. ]
# 单位矩阵
eye_arr = np.eye(3) # 3x3单位矩阵
print(eye_arr)
# [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
# 随机数组(均匀分布[0,1))
rand_arr = np.random.rand(2, 2) # 2x2随机数组
print(rand_arr) # 示例输出:[[0.123 0.456] [0.789 0.012]]
# 随机整数数组(0-9,2x3)
randint_arr = np.random.randint(0, 10, size=(2, 3))
print(randint_arr) # 示例输出:[[5 3 7] [2 8 1]]
3. 从文件读取:np.loadtxt()/np.genfromtxt()
若数据存储在文本文件(如CSV)中,可通过np.loadtxt()或np.genfromtxt()读取为Ndarray。
示例(读取CSV):
假设data.csv内容为:
1,2,3
4,5,6
7,8,9
# 读取CSV(逗号分隔)
data = np.loadtxt('data.csv', delimiter=',')
print(data)
# [[1. 2. 3.]
# [4. 5. 6.]
# [7. 8. 9.]]
三、Ndarray的基本属性
理解Ndarray的属性是高效使用的前提,常用属性如下:
| 属性 | 含义 |
|---|---|
ndim | 数组维度(秩),如1维数组ndim=1,2维数组ndim=2。 |
shape | 数组形状,元组形式(如(3,2)表示3行2列)。 |
size | 数组总元素个数(shape各维度乘积,如(3,2)的size=6)。 |
dtype | 元素数据类型(如int64、float32、bool_)。 |
itemsize | 每个元素的字节大小(如int64为8字节,float32为4字节)。 |
nbytes | 数组总字节数(size * itemsize)。 |
示例:
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int32)
print("维度:", arr.ndim) # 2
print("形状:", arr.shape) # (2, 3)
print("总元素数:", arr.size) # 6
print("数据类型:", arr.dtype) # int32
print("单个元素字节:", arr.itemsize) # 4(int32占4字节)
print("总字节数:", arr.nbytes) # 24(6 * 4)
四、Ndarray的使用:索引、切片、变形与运算
1. 索引与切片(访问元素)
Ndarray的索引与切片规则类似Python列表,但支持多维操作。
- 1维数组:与普通列表一致(正索引、负索引、
start:end:step)。 - 多维数组:通过逗号分隔各维度的索引(如
arr[i, j]表示第i行第j列)。
示例:
# 1维数组索引与切片
arr1 = np.array([10, 20, 30, 40, 50])
print(arr1[2]) # 30(正索引)
print(arr1[-1]) # 50(负索引,-1表示最后一个)
print(arr1[1:4]) # [20 30 40](切片,左闭右开)
print(arr1[::2]) # [10 30 50](步长2)
# 2维数组索引与切片
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2[1, 2]) # 6(第2行第3列,索引从0开始)
print(arr2[0:2, 1:])# 前两行,从第2列开始切片 → [[2 3] [5 6]]
print(arr2[:, ::2]) # 所有行,步长2取列 → [[1 3] [4 6] [7 9]]
2. 重塑形状(Reshaping)
通过reshape()方法调整数组形状(不改变数据,返回新视图;若无法整除则报错)。
示例:
arr = np.arange(12) # [0 1 2 ... 11]
reshaped = arr.reshape(3, 4) # 转为3行4列
print(reshaped)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# 自动计算某一维度(-1)
reshaped_auto = arr.reshape(-1, 6) # 总元素12,-1表示自动计算行数(12/6=2)→ 2行6列
print(reshaped_auto.shape) # (2, 6)
3. 运算(向量化操作)
Ndarray支持逐元素运算(无需循环),且支持广播(Broadcasting)机制(不同形状数组的兼容运算)。
(1)基本算术运算(+、-、*、/、//、%)
示例:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b) # [5 7 9](对应元素相加)
print(a * 2) # [2 4 6](标量乘法,广播)
print(a > 2) # [False False True](布尔运算)
(2)矩阵运算(点积、转置)
- 点积(矩阵乘法):使用
@运算符或np.dot()。 - 转置:
arr.T或np.transpose(arr)。
示例:
# 矩阵乘法(点积)
m1 = np.array([[1, 2], [3, 4]]) # 2x2矩阵
m2 = np.array([[5, 6], [7, 8]]) # 2x2矩阵
dot_product = m1 @ m2 # 或 np.dot(m1, m2)
print(dot_product)
# [[19 22] # (1 * 5+2 * 7, 1 * 6+2 * 8)
# [43 50]] # (3 * 5+4 * 7, 3 * 6+4 * 8)
# 转置
print(m1.T) # [[1 3] [2 4]]
(3)广播(Broadcasting)
当数组形状不同时,NumPy会自动扩展较小数组以匹配较大数组的形状(需满足广播规则:从尾维度开始对齐,维度相等或其中一个为1)。
示例:
# 标量与数组广播(标量扩展为同形状数组)
arr = np.array([[1, 2], [3, 4]])
print(arr + 10) # [[11 12] [13 14]](10扩展为[[10,10],[10,10]])
# 不同形状数组广播(行向量与矩阵)
row = np.array([1, 2]) # shape=(2,)
matrix = np.array([[3, 4], [5, 6]]) # shape=(2,2)
print(row + matrix) # [[4 6] [6 8]](row扩展为[[1,2],[1,2]])
五、注意事项
- 数据类型一致性:Ndarray所有元素类型相同,混合类型会被强制转换(如
np.array([1, 2.5])的dtype为float64)。 - 视图与副本:
reshape()、切片等操作返回原数组的视图(共享内存,修改视图会影响原数组);copy()方法返回副本(独立内存)。arr = np.array([1, 2, 3]) view = arr[1:] # 视图 view[0] = 100 print(arr) # [1 100 3](原数组被修改) copy = arr.copy() # 副本 copy[0] = 200 print(arr) # [1 100 3](原数组不受影响) - 性能优势:尽量使用向量化运算(避免Python循环),充分利用NumPy的C底层优化。
总结
Ndarray是NumPy的核心,其创建方式灵活(从序列、特殊函数到文件读取),属性清晰(维度、形状、类型等),使用中需注意索引切片、重塑形状和向量化运算。掌握Ndarray是深入学习数据分析、机器学习的基础。

























暂无评论内容