
本教程深入解析NumPy数组的维度与形状。我们将澄清为何np.array([7, 1])生成形状为(2,)的一维数组,而非预期的(1, 2)。文章将详细解释如何通过嵌套列表创建多维数组,并提供多种将一维数组转换为指定二维形状的实用技巧,助您精准控制NumPy数据结构。
在NumPy中,理解数组的形状(shape)和维度(ndim)是高效数据处理的基础。这两个属性决定了数组的结构,对于数据的存储、操作和计算至关重要。初学者常会混淆一维数组与具有单行或单列的二维数组的表示方式。本文将通过具体示例,详细阐述NumPy数组的维度判断规则,并提供灵活的形状转换方法。
NumPy数组的shape属性返回一个元组,表示数组在每个维度上的大小。ndim属性则返回数组的维度数量。例如,一个形状为(m, n)的数组是二维的,表示它有m行和n列。
考虑以下代码示例:
import numpy as np
A = np.array([
[-1, 3],
[3, 2]
], dtype=np.dtype(float))
b = np.array([7, 1], dtype=np.dtype(float))
print(f"Shape of A: {A.shape}")
print(f"Shape of b: {b.shape}")
print(f"Dimensions of A: {A.ndim}")
print(f"Dimensions of b: {b.ndim}")输出结果如下:
Shape of A: (2, 2) Shape of b: (2,) Dimensions of A: 2 Dimensions of b: 1
从输出可以看出,A是一个形状为(2, 2)的二维数组,这符合我们的直观理解。然而,b的形状是(2,),维度是1。这表明b是一个一维数组,包含两个元素。许多用户可能会预期b的形状是(1, 2),即一个包含一行两列的二维数组。这种差异是理解NumPy数组维度的关键。
NumPy数组的维度主要由其初始化时嵌套列表的层数决定。
当使用单个方括号列表初始化数组时,NumPy会创建一个一维数组。例如,np.array([7, 1])表示一个包含两个元素的序列,它没有“行”或“列”的概念,只有一个维度。
b_1d = np.array([7, 1], dtype=np.dtype(float))
print(f"Array: {b_1d}")
print(f"Shape: {b_1d.shape}") # Output: (2,)
print(f"Dimensions: {b_1d.ndim}") # Output: 1要创建具有一行两列的二维数组,需要使用两层嵌套的方括号,表示“一个包含一个列表的列表”。
b_2d_row = np.array([[7, 1]], dtype=np.dtype(float))
print(f"Array: {b_2d_row}")
print(f"Shape: {b_2d_row.shape}") # Output: (1, 2)
print(f"Dimensions: {b_2d_row.ndim}") # Output: 2这里,外层方括号表示第一维(行),内层方括号表示第二维(列)。
创建更高维数组的原理相同,只需增加嵌套方括号的层数。
b_3d = np.array([[[7, 1]]], dtype=np.dtype(float))
print(f"Array: {b_3d}")
print(f"Shape: {b_3d.shape}") # Output: (1, 1, 2)
print(f"Dimensions: {b_3d.ndim}") # Output: 3在这个例子中,数组有三层嵌套,因此是三维的。形状(1, 1, 2)表示第一个维度有1个元素,第二个维度有1个元素,第三个维度有2个元素。
有时,我们可能已经有一个一维数组,但需要将其转换为特定的多维形状(例如,将(2,)转换为(1, 2))。NumPy提供了多种方法来实现这一点。
可以直接修改数组的shape属性来改变其形状。这种方法会原地修改数组。
b_original = np.array([7, 1], dtype=np.dtype(float))
print(f"Original array: {b_original}, Shape: {b_original.shape}")
b_original.shape = (1, 2) # 将形状修改为 (1, 2)
print(f"Modified array: {b_original}, Shape: {b_original.shape}")
# Output:
# Original array: [7. 1.], Shape: (2,)
# Modified array: [[7. 1.]], Shape: (1, 2)注意事项: 这种方法要求新形状的元素总数必须与原数组的元素总数相同。同时,它会修改原始数组。
通过在索引中使用 None 或 np.newaxis,可以在指定位置插入新的维度。这是一种非常灵活且常用的方法。
b_original = np.array([7, 1], dtype=np.dtype(float))
print(f"Original array: {b_original}, Shape: {b_original.shape}")
# 在第一个维度前插入一个新维度,将 (2,) 变为 (1, 2)
b_reshaped_none = b_original[None, :]
print(f"Reshaped with None: {b_reshaped_none}, Shape: {b_reshaped_none.shape}")
# 另一种等效写法,使用 np.newaxis
b_reshaped_newaxis = b_original[np.newaxis, :]
print(f"Reshaped with np.newaxis: {b_reshaped_newaxis}, Shape: {b_reshaped_newaxis.shape}")
# 如果想将 (2,) 变为 (2, 1) (即列向量),则可以这样操作:
b_reshaped_column = b_original[:, None]
print(f"Reshaped to column vector: {b_reshaped_column}, Shape: {b_reshaped_column.shape}")
# Output:
# Original array: [7. 1.], Shape: (2,)
# Reshaped with None: [[7. 1.]], Shape: (1, 2)
# Reshaped with np.newaxis: [[7. 1.]], Shape: (1, 2)
# Reshaped to column vector: [[7.] [1.]], Shape: (2, 1)使用 None 或 np.newaxis 不会修改原始数组,而是返回
以上就是NumPy数组形状深度解析:理解维度与多维数组创建的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号