NumPy - 数组形状
NumPy 数组形状
NumPy 数组的形状是一个整数元组。元组中的每个整数表示数组沿特定维度或轴的大小。例如,形状为 (3, 4) 的数组有 3 行 4 列。
- 对于二维数组,其形状是一个包含两个元素的元组:行数,列数。
- 对于三维数组,其形状是一个包含三个元素的元组:深度,行数,列数。
- 高维数组遵循相同的模式,每个维度的大小都表示为元组中的附加元素。
访问数组形状
您可以使用 shape 属性访问 NumPy 数组的形状。此属性返回一个整数元组,每个整数表示数组沿特定维度的大小。
示例
在以下示例中,我们将创建一个二维数组,并使用 NumPy 的"shape"属性获取其形状 -
import numpy as np # 创建二维数组 array = np.array([[1, 2, 3], [4, 5, 6]]) # 访问形状 print("数组形状:", array.shape) print("维数:", array.ndim) print("元素总数:", array.size)
形状 (2, 3) 表示该数组有 2 行 3 列。它是一个二维数组 −
数组形状:(2, 3) 维数:2 元素总数:6
更改数组形状
更改 NumPy 数组的形状是指在不改变数组数据的情况下改变其维度。例如,只要元素总数保持不变,一维数组就可以重新整形为二维数组,反之亦然。
要在 NumPy 中重塑数组,我们使用 reshape() 函数。如果可能,此函数将返回具有指定形状的数组新视图。如果视图无法重塑,则会创建数组的副本。
示例
在此示例中,我们通过将"-1"作为参数传递给 Numpy reshape() 函数,将二维数组的形状更改为一维数组。这会自动推断出一维数组的大小 -
import numpy as np # 创建二维数组 array_2d = np.array([[1, 2, 3], [4, 5, 6]]) print("原始二维数组: ", array_2d) # 重塑为一维数组 array_flattened = array_2d.reshape(-1) print("扁平化为一维数组:", array_flattened)
这将产生以下结果 -
原始二维数组: [[1 2 3] [4 5 6]] 扁平化为一维数组:[1 2 3 4 5 6]
处理重塑错误
如果使用不当,在 NumPy 中重塑数组有时会导致错误。当您尝试将数组重塑为与数组元素总数不兼容的形状时,就会发生此错误。
重塑时,元素总数必须保持不变。如果重塑操作与元素总数不兼容,NumPy 将引发 ValueError。
示例:形状不兼容错误
当您尝试将数组重塑为与数组元素总数不兼容的形状时,就会发生形状不兼容错误。
在下面的示例中,原始数组包含"12"个元素。将其重塑为形状"(3, 5)"需要 15 个元素,这将导致 ValueError -
import numpy as np # 创建一个包含 12 个元素的数组 array = np.arange(12) # 尝试将其重塑为需要更多元素的形状 try: reshaped_array = array.reshape((3, 5)) except ValueError as e: print("Error:", e)
以下是上述代码的输出 -
Error: cannot reshape array of size 12 into shape (3,5)
示例:负维度错误
在重塑维度中使用 -1 会告知 NumPy 自动计算该维度的大小。但是,如果剩余维度与元素总数不一致,则会引发错误 -
import numpy as np # 创建一个包含 10 个元素的数组 array = np.arange(10) # 尝试使用不兼容的自动维度进行重塑 try: reshaped_array = array.reshape((2, -1, 4)) except ValueError as e: print("Error:", e)
获得的输出如下所示 -
Error: cannot reshape array of size 10 into shape (2,newaxis,4)
示例:维度指定错误
指定不正确或非整数的维度值(例如,除 -1 以外的负值或非整数)可能会导致错误 -
import numpy as np # 创建一个包含 16 个元素的数组 array = np.arange(16) # 尝试使用无效维度进行重塑 try: reshaped_array = array.reshape((4, 4.5)) except ValueError as e: print("Error:", e)
执行上述代码后,我们得到以下输出 -
Traceback (most recent call last): File "/home/cg/root/669f5fd83ed84/main.py", line 8, in <module> reshaped_array = array.reshape((4, 4.5)) TypeError: 'float' object cannot be interpreted as an integer