1. numpy.ndarray.reshape()函数介绍
numpy是Python中常用的数学库,用于科学计算和数据分析。其中ndarray是numpy的核心数组对象,它支持多维数组和大量的数学操作。reshape()函数是ndarray中常用的函数之一,它的作用是改变数组的形状。reshape()函数的格式如下:
numpy.ndarray.reshape(shape, order='C')
其中,shape是一个整数或整数序列,指定了新数组的形状。order参数是可选的,默认为'C'。它指定了新数组中元素存储的顺序,'C'表示按行存储,'F'表示按列存储。请注意,reshape()函数不会修改数组的原始数据,它只返回一个新的数组对象。
2. reshape()函数的参数问题
2.1 shape参数
reshape()函数最重要的参数就是shape,它指定了新数组的形状。在使用reshape()函数时,我们通常需要先确定新数组的形状。我们可以使用一个元组来指定shape参数,元组的每个元素表示新数组在对应维度上的大小。例如:
import numpy as np
# 创建一个3行4列的二维数组
a = np.arange(12).reshape((3, 4))
print(a)
# 输出:
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# 将a转换为6行2列的二维数组
b = a.reshape((6, 2))
print(b)
# 输出:
# [[ 0 1]
# [ 2 3]
# [ 4 5]
# [ 6 7]
# [ 8 9]
# [10 11]]
# 将a转换为2层3行4列的三维数组
c = a.reshape((2, 3, 4))
print(c)
# 输出:
# [[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]]
需要注意的是,reshape()函数的shape参数必须符合原始数组的大小,否则会抛出ValueError异常。例如,如果尝试将一个大小为10的一维数组转换为3行4列的二维数组,则会抛出异常:
import numpy as np
a = np.arange(10)
b = a.reshape((3, 4)) # 抛出ValueError异常
2.2 order参数
reshape()函数的order参数指定了新数组中元素存储的顺序,对于二维数组而言,'C'表示按行存储,'F'表示按列存储。例如:
import numpy as np
a = np.arange(12).reshape((3, 4))
print(a)
# 输出:
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
b = a.reshape((3, 4), order='C')
print(b)
# 输出:
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
c = a.reshape((3, 4), order='F')
print(c)
# 输出:
# [[ 0 3 6 9]
# [ 1 4 7 10]
# [ 2 5 8 11]]
需要注意的是,默认值是'C',但不同的操作系统可能会默认使用不同的值。相比之下,'C'比'F'更常用,因为它更符合人的思维习惯。
3. reshape()函数的其他用法
3.1 将多维数组转换为一维数组
除了改变数组的形状之外,reshape()函数还可以将多维数组转换为一维数组。在这种情况下,我们只需要将shape参数设置为一个整数即可。例如:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.reshape((6,))
print(b)
# 输出:
# [1 2 3 4 5 6]
3.2 自动推导shape参数
在某些情况下,我们希望将一个数组转换为另一个数组,但不确定新数组的shape参数。这时,reshape()函数允许我们使用特殊的值-1来表示在不知道实际值时自动推导。例如:
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.reshape((-1,))
print(b)
# 输出:
# [1 2 3 4 5 6]
c = a.reshape((3, -1))
print(c)
# 输出:
# [[1 2]
# [3 4]
# [5 6]]
在上面的例子中,我们用-1表示在不知道实际行数时自动推导。在第一个例子中,我们可以得到一个一维数组,其中包含了所有的元素。在第二个例子中,我们用-1表示在不知道实际列数时自动推导。可以看到,新数组的行数为3,列数为2。
3.3 与numpy.newaxis配合使用
numpy.newaxis是一个特殊的常量,用于扩展数组的维度。与reshape()函数结合使用,可以方便地增加或减少数组的维度。例如:
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
b = a.reshape((a.shape[0], 1))
print(b.shape)
# 输出:
# (6, 1)
c = a.reshape((a.shape[0], 1, 1))
print(c.shape)
# 输出:
# (6, 1, 1)
在上面的例子中,我们用reshape()函数将一维数组a转换为二维或三维数组。为了方便起见,我们使用a.shape[0]来引用数组a的长度。可以看到,reshape()函数与numpy.newaxis配合使用,可以方便地增加或减少数组的维度。
4. 总结
经过本文的介绍,我们了解了numpy.ndarray.reshape()函数的用法和参数问题。在使用reshape()函数时,我们需要确定新数组的形状和元素存储顺序。需要注意的是,reshape()函数不会修改原始数据,它只返回一个新的数组对象。在实际使用中,我们可以通过自动推导、numpy.newaxis等方式方便地改变数组的维度。