NumPy中reshape()与resize()的核心差异在于:reshape()返回新形状的视图,不改变原数组,要求元素总数不变;resize()则原地修改数组,可改变元素数量,不足时填充0,多余时截断。

在Python中,NumPy数组改变形状(或者说重塑)最核心、最常用的方法是使用
reshape()
当我们需要改变NumPy数组的形状时,
numpy.reshape()
举个例子,假设你有一个一维数组,里面有12个元素,你想把它变成一个3行4列的二维数组:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
print("原始数组:", arr)
print("原始形状:", arr.shape) # 输出 (12,)
# 使用 reshape 改变形状
new_arr = arr.reshape((3, 4))
print("\n重塑后的数组:\n", new_arr)
print("新形状:", new_arr.shape) # 输出 (3, 4)
# 验证原始数组未被修改
print("\n原始数组(确认未修改):", arr)这里需要注意的是,
reshape()
立即学习“Python免费学习笔记(深入)”;
一个非常方便的特性是,你可以在新形状的元组中使用
-1
# 使用 -1 让 NumPy 自动推断维度
arr_2d = arr.reshape((2, -1)) # 变成2行,列数自动推断
print("\n使用 -1 重塑为 (2, -1):\n", arr_2d)
print("形状:", arr_2d.shape) # 输出 (2, 6)
arr_3d = arr.reshape((-1, 2, 2)) # 变成 x 层,每层2行2列
print("\n使用 -1 重塑为 (-1, 2, 2):\n", arr_3d)
print("形状:", arr_3d.shape) # 输出 (3, 2, 2)但无论如何重塑,一个基本原则是:新形状的元素总数必须与原始数组的元素总数保持一致。否则,NumPy会抛出一个
ValueError
reshape()
resize()
说实话,刚开始接触NumPy时,我个人也常常会混淆
reshape()
resize()
reshape()
reshape()
reshape()
import numpy as np
original_arr = np.arange(6) # [0, 1, 2, 3, 4, 5]
reshaped_arr = original_arr.reshape((2, 3))
print("原始数组:", original_arr)
print("重塑后的数组:\n", reshaped_arr)
# 尝试修改重塑后的数组
reshaped_arr[0, 0] = 99
print("\n修改重塑后的数组后,原始数组:", original_arr) # 原始数组也会被修改,因为是视图而
numpy.resize()
np.resize()
arr.resize()
# np.resize() 作为函数,返回一个新数组
arr_func_resize = np.arange(4) # [0, 1, 2, 3]
resized_by_func = np.resize(arr_func_resize, (3, 3)) # 元素总数从4变为9,会填充0
print("\n使用 np.resize() 函数重塑并填充:\n", resized_by_func)
print("原始数组(函数操作不影响):", arr_func_resize)
# arr.resize() 作为数组方法,原地修改
arr_method_resize = np.arange(4) # [0, 1, 2, 3]
print("\n原地修改前:", arr_method_resize)
arr_method_resize.resize((2, 3)) # 元素总数从4变为6,填充0
print("原地修改后:\n", arr_method_resize)
arr_method_truncate = np.arange(6) # [0, 1, 2, 3, 4, 5]
print("\n原地截断前:", arr_method_truncate)
arr_method_truncate.resize((2, 2)) # 元素总数从6变为4,截断
print("原地截断后:\n", arr_method_truncate)在我看来,
resize()
reshape()
resize()
reshape()
resize()
将多维数组展平为一维数组,是数据预处理和机器学习中非常常见的操作,比如在将图像数据输入到全连接层之前。NumPy提供了几种灵活的方式来实现这一点,每种方式都有其细微的差别和适用场景。
最直接也是我个人最常用的一种方式是结合
reshape()
-1
arr.reshape(-1)
-1
import numpy as np
matrix = np.array([[1, 2, 3],
[4, 5, 6]])
print("原始矩阵:\n", matrix)
flattened_by_reshape = matrix.reshape(-1)
print("\n通过 reshape(-1) 展平:\n", flattened_by_reshape)
print("形状:", flattened_by_reshape.shape)除了
reshape(-1)
arr.flatten()
order
flattened_by_flatten = matrix.flatten()
print("\n通过 flatten() 展平 (副本):\n", flattened_by_flatten)
flattened_by_flatten[0] = 99 # 修改副本
print("修改副本后:", flattened_by_flatten)
print("原始矩阵(未受影响):\n", matrix)
# 以F-order展平
flattened_f_order = matrix.flatten(order='F')
print("\n通过 flatten() 以 F-order 展平:\n", flattened_f_order)arr.ravel()
ravel()
flatten()
ravel()
ravel()
flatten()
flatten()
order
flattened_by_ravel = matrix.ravel()
print("\n通过 ravel() 展平 (视图或副本):\n", flattened_by_ravel)
flattened_by_ravel[0] = 100 # 如果是视图,原始矩阵会改变
print("修改 ravel() 结果后:", flattened_by_ravel)
print("原始矩阵(可能受影响):\n", matrix) # 这里的 matrix 会变成 [[100, 2, 3], [4, 5, 6]]在我个人实践中,如果我需要一个独立的数据副本,我可能会明确使用
flatten()
reshape(-1)
ravel()
在NumPy中进行数组形状操作时,虽然看似简单,但一些常见的陷阱可能会让人头疼。理解这些错误并掌握规避策略,能帮助我们更顺畅地处理数据。
元素总数不匹配(ValueError
ValueError: cannot reshape array of size X into shape Y
import numpy as np
arr = np.arange(10) # 10个元素
# 错误示例:尝试重塑为 (3, 3),只有9个元素空间
try:
arr.reshape((3, 3))
except ValueError as e:
print(f"\n捕获到错误: {e}")规避策略:
arr.size
np.prod(new_shape)
-1
-1
视图(View)与副本(Copy)的混淆 如前所述,
reshape()
ravel()
flatten()
original = np.array([[1, 2], [3, 4]])
reshaped_view = original.reshape(-1)
flattened_copy = original.flatten()
reshaped_view[0] = 99 # 修改视图
print("\n修改视图后,原始数组:", original) # original 变成了 [[99, 2], [3, 4]]
flattened_copy[0] = 88 # 修改副本
print("修改副本后,原始数组:", original) # original 仍然是 [[99, 2], [3, 4]]规避策略:
.copy()
flatten()
reshape()
ravel()
flatten()
arr.base is None
base
内存布局(C-order vs. F-order)的影响 NumPy数组在内存中可以是行优先(C-order,默认)或列优先(F-order)存储。在大多数情况下,这不会直接导致错误,但在进行重塑时,特别是从一个维度跳到另一个维度时,它会影响元素的读取顺序。如果你从其他语言(如MATLAB)或库中获取数据,这可能会导致数据的意外排列。
arr_c = np.arange(6).reshape((2, 3), order='C')
arr_f = np.arange(6).reshape((2, 3), order='F')
print("\nC-order 数组:\n", arr_c)
print("F-order 数组:\n", arr_f)
# 尝试将 F-order 数组重塑为不同形状,可能会导致元素顺序的误解
reshaped_from_f = arr_f.reshape((3, 2), order='C') # 以C-order方式重塑
print("\n从 F-order 数组以 C-order 重塑:\n", reshaped_from_f)规避策略:
order
reshape()
flatten()
ravel()
order='C'
order='F'
np.ascontiguousarray()
resize()
resize()
resize
规避策略:
reshape()
reshape()
arr.resize()
resize
在我看来,掌握这些规避策略,特别是对视图与副本的理解,以及善用
-1
以上就是python中numpy怎么改变数组的形状(reshape)?的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号