Python 数据科学与可视化工具箱 (一) - 数组属性:`shape`, `dtype`, `ndim`, `size`
在前文中,我们学习了如何创建 NumPy 数组。创建数组只是第一步,要高效地操作和理解这些数组,你必须先了解它们的核心属性。这些属性就像是数组的“身份证”,详细描述了它的结构和内容。本篇将重点介绍 NumPy 数组最常用的四个属性:shape
, dtype
, ndim
, 和 size
。
1. 为什么数组属性如此重要?
在处理数据时,你经常需要知道数据的维度、大小和类型,以便进行正确的计算和转换。例如:
- 形状 (
shape
):你想对两个矩阵进行乘法运算,你必须先确认它们的形状是否符合乘法规则。 - 数据类型 (
dtype
):你想计算一个数组的平均值,你需要知道它是否由数字组成,而不是字符串。 - 维数 (
ndim
):你想将一个三维的图像数据展平为一维,你需要知道它的维数。 - 总大小 (
size
):你想评估一个数组占用的内存大小,你需要知道它包含多少个元素。
掌握这些属性,能让你在数据处理中做到心中有数,避免许多常见的错误。
2. NumPy 数组核心属性详解
我们将通过一系列示例来深入了解这四个属性。
2.1 shape
:数组的形状
shape
属性是一个元组,它告诉你在数组的每一个维度上,有多少个元素。元组的长度等于数组的维数 (ndim
)。
- 功能: 表示数组在每个轴上的大小。
- 类型: 元组
(d1, d2, ..., dn)
,其中 d_id\_id_i 是第 iii 维的大小。
示例与说明:
import numpy as np# 一维数组 (向量)
arr1d = np.array([1, 2, 3, 4, 5])
print("一维数组:", arr1d)
print("形状 (shape):", arr1d.shape) # 输出: (5,)
# 只有一个维度,大小为 5。元组中的逗号表示它是一个单元素元组。# 二维数组 (矩阵)
arr2d = np.array([[10, 11, 12], [13, 14, 15]])
print("\n二维数组:\n", arr2d)
print("形状 (shape):", arr2d.shape) # 输出: (2, 3)
# 两个维度:第一个维度有 2 行,第二个维度有 3 列。# 三维数组
arr3d = np.arange(1, 28).reshape(3, 3, 3)
print("\n三维数组:\n", arr3d)
print("形状 (shape):", arr3d.shape) # 输出: (3, 3, 3)
# 三个维度:3 个“页” (blocks),每个页有 3 行,每行有 3 列。# shape 的灵活运用:重塑 (Reshaping)
# shape 属性本身是不可变的,但你可以使用 `reshape()` 方法来改变数组的形状。
arr = np.arange(12)
print("\n原始数组 (12个元素):", arr)
arr_reshaped = arr.reshape((3, 4))
print("重塑为 3x4 矩阵:\n", arr_reshaped)
print("新形状:", arr_reshaped.shape)
# 注意:重塑时新旧数组的元素总数必须相同 (12 = 3 * 4)。
# 重塑时,可以使用 -1 作为某个维度的大小,NumPy 会自动计算它。
arr_auto_reshaped = arr.reshape((2, -1))
print("自动计算形状 (2x6):\n", arr_auto_reshaped)
print("新形状:", arr_auto_reshaped.shape)
shape
是数据处理和算法设计中最关键的属性之一。
2.2 dtype
:数组的数据类型
dtype
属性描述了数组中元素的数据类型。因为 ndarray
是同质的,所有元素都必须是相同类型。NumPy 支持比标准 Python 类型更丰富的数值类型,例如 int8
, int32
, float64
, bool_
等,这使得内存使用更高效,计算更精确。
- 功能: 表示数组中每个元素的数据类型。
- 类型:
numpy.dtype