numpy学习笔记8:数组属性和基础操作的详细描述
numpy学习笔记8:数组属性和基础操作的详细描述
以下是 NumPy 数组的核心属性和基础操作的详细说明,涵盖从数据结构到实际应用的各个方面:
一、NumPy 数组的核心属性
1. shape
- 数组形状
-
作用:描述数组每个维度的长度(以元组形式返回)。
-
示例:
import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr.shape) # 输出 (2, 3) → 2行3列
-
操作:
-
修改形状:
arr.reshape(new_shape)
(需元素总数一致)arr_reshaped = arr.reshape(3, 2) # 形状变为 (3, 2)
-
2. dtype
- 数据类型
-
作用:显示数组元素的数据类型(如
int32
,float64
,bool
)。 -
示例:
print(arr.dtype) # 输出 int64(默认推断类型)
-
指定类型:
arr_float = np.array([1, 2, 3], dtype=np.float32)
3. ndim
- 维度数
-
作用:返回数组的维度数量(秩)。
-
示例:
arr_3d = np.ones((2, 3, 4)) print(arr_3d.ndim) # 输出 3(三维数组)
4. size
- 元素总数
-
作用:计算数组所有维度的元素乘积。
-
示例:
print(arr.size) # 输出 6(2*3=6)
5. itemsize
- 单个元素字节大小
-
作用:显示一个数组元素的字节数。
-
示例:
print(arr.itemsize) # 输出 8(int64 类型占8字节)
6. nbytes
- 总内存占用
-
作用:计算数组总内存占用量(
size * itemsize
)。 -
示例:
print(arr.nbytes) # 输出 48(6元素 * 8字节)
二、数组基础操作
1. 索引与切片
-
一维数组:
arr = np.array([0, 1, 2, 3, 4]) print(arr[2]) # 输出 2(索引从0开始) print(arr[1:4]) # 输出 [1, 2, 3](左闭右开区间)
-
多维数组:
arr_2d = np.array([[1, 2, 3], [4, 5, 6]]) print(arr_2d[0, 1]) # 输出 2(第0行第1列) print(arr_2d[:, 1:3]) # 输出所有行的第1到2列 → [[2,3], [5,6]]
2. 形状操作
-
reshape()
:改变形状(不修改数据):arr = np.arange(6) arr_2d = arr.reshape(2, 3) # 转为二维数组
-
flatten()
和ravel()
:flat = arr_2d.flatten() # 深拷贝展开(新内存) raveled = arr_2d.ravel() # 浅拷贝展开(视图)
3. 数学运算
-
逐元素运算:
a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) print(a + b) # 输出 [5, 7, 9](加法) print(a * 2) # 输出 [2, 4, 6](标量乘法)
-
广播机制(不同形状数组运算):
a = np.array([[1], [2], [3]]) # 形状 (3,1) b = np.array([10, 20]) # 形状 (2,) print(a + b) # 广播后形状 (3,2) → [[11,21], [12,22], [13,23]]
4. 统计操作
-
聚合函数:
arr = np.array([[1, 2], [3, 4]]) print(np.sum(arr)) # 总和 → 10 print(np.mean(arr)) # 平均值 → 2.5 print(np.max(arr)) # 最大值 → 4
-
沿轴计算:
print(np.sum(arr, axis=0)) # 列求和 → [4, 6] print(np.sum(arr, axis=1)) # 行求和 → [3, 7]
5. 数组拼接
-
np.concatenate()
:a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6]]) c = np.concatenate((a, b), axis=0) # 垂直拼接 → 形状 (3,2)
-
np.vstack()
和np.hstack()
:vertical = np.vstack((a, b)) # 垂直拼接 horizontal = np.hstack((a, a)) # 水平拼接 → 形状 (2,4)
三、内存管理与性能优化
1. 视图(View)与拷贝(Copy)
-
视图:共享内存的数据切片(修改视图会影响原数组):
view = arr[1:3] # 视图(不复制数据) view[0] = 100 # 原数组对应位置也被修改
-
拷贝:创建独立副本:
copy = arr.copy() # 深拷贝(新内存)
2. 内存布局
-
order
参数:# C 顺序(行优先) c_array = np.array([[1, 2], [3, 4]], order='C') # Fortran 顺序(列优先) f_array = np.array([[1, 2], [3, 4]], order='F')
四、常用技巧与注意事项
-
避免显式循环:
# 错误示范(慢): for i in range(len(arr)):arr[i] *= 2 # 正确示范(快): arr *= 2 # 向量化操作
-
布尔索引:
arr = np.array([3, 1, 4, 1, 5]) mask = arr > 2 print(arr[mask]) # 输出 [3,4,5]
-
类型转换:
arr_float = arr.astype(np.float32) # 转换为浮点数
通过掌握这些属性和操作,你可以高效操作 NumPy 数组,为数据分析、科学计算和机器学习奠定基础!