变换数组的形态
1. 改变数组的形状
在对数组进行操作时,经常要改变数组的维度。
在NumPy中,常用reshape
函数改变数组的“形状”,也就是改变数组的维度。其参数为一个正整数元组,分别指定数组在每个维度上的大小。
reshape
函数在改变原始数据的形状的同时不改变原始数据的值。
如果指定的维度和数组的元素数目不吻合,则函数将抛出异常。
案例:改变数组形状
# 创建一维数组
arr = np.arange(12)
print('创建的一维数组为:',arr)
# 设置数组的形状
print('新的一维数组为:',arr.reshape(3,4))
# 查看数组维度
print('数组维度为:',arr.reshape(3,4).ndim)
创建的一维数组为: [ 0 1 2 3 4 5 6 7 8 9 10 11]
新的一维数组为: [[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
数组维度为: 2
2. 展平数组
在NumPy中,可以使用ravel
函数完成数组展平工作。flatten
函数也可以完成数组展平工作。
ravel()
返回的是原始数组的视图,原始数组本身并没有发生变化。flatten()
会重新分配内存,完成一次从原始数据到新内存空间的深拷贝,但原始数组并没有发生任何变化。
案例:展平数组
arr = np.arange(12).reshape(3,4)
print('创建的二维数组为:',arr)
print('数组展平后为:',arr.ravel())
print('数组展平后为:',arr.ravel('F'))
创建的二维数组为: [[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
数组展平后为: [ 0 1 2 3 4 5 6 7 8 9 10 11]
数组展平后为: [ 0 4 8 1 5 9 2 6 10 3 7 11]
# 横向展平
print('数组展平为:',arr.flatten())
# 纵向展平
print('数组展平为:',arr.flatten('F'))
数组展平为: [ 0 1 2 3 4 5 6 7 8 9 10 11]
数组展平为: [ 0 4 8 1 5 9 2 6 10 3 7 11]
3.组合数组
除了可以改变数组“形状”外,NumPy也可以对数组进行组合(堆叠)。组合主要有横向组合与纵向组合。可使用hstack
函数、vstack
函数以及concatenate
函数来完成数组的组合。
横向组合是将ndarray
对象构成的元组作为参数,传给hstack
函数。
纵向组合同样是将ndarray
对象构成的元组作为参数,只不过传给vstack
函数。
concatenate
函数也可以实现数组的横向组合和纵向组合,其中参数axis=1
时按照横轴组合,参数axis = 0
时按照纵轴组合。
案例:组合数组
import numpy as np
arr1 = np.arange(12).reshape(3,4)
print('创建的数组1为:',arr1)
arr2 = arr1*3
print('创建的数组2为:',arr2)
print('横向组合为:',np.hstack((arr1,arr2))) #hstack函数横向组合
print('纵向组合为:',np.vstack((arr1,arr2))) #vstack函数纵向组合
print('横向组合为:',np.concatenate((arr1,arr2),axis = 1)) #concatenate函数横向组合
print('纵向组合为:',np.concatenate((arr1,arr2),axis = 0)) #concatenate函数纵向组合
创建的数组1为: [[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
创建的数组2为: [[ 0 3 6 9]
[12 15 18 21]
[24 27 30 33]]
横向组合为: [[ 0 1 2 3 0 3 6 9]
[ 4 5 6 7 12 15 18 21]
[ 8 9 10 11 24 27 30 33]]
纵向组合为: [[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[ 0 3 6 9]
[12 15 18 21]
[24 27 30 33]]
横向组合为: [[ 0 1 2 3 0 3 6 9]
[ 4 5 6 7 12 15 18 21]
[ 8 9 10 11 24 27 30 33]]
纵向组合为: [[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[ 0 3 6 9]
[12 15 18 21]
[24 27 30 33]]
4.分割数组
还可以对数组进行分割。NumPy提供了hsplit
、vsplit
、dsplit
和split
函数,可以将数组分割成相同大小的子数组,也可以指定原数组中需要分割的位置。
使用hsplit
函数可以对数组进行横向分割。
使用vsplit
函数可以对数组进行纵向分割。
split
函数同样可以实现数组分割。在参数axis=1
时,可以进行横向分割;在参数axis=0
时,可以进行纵向分割。
案例:分割数组
arr = np.arange(16).reshape(4,4)
print('创建的二维数组为:\n',arr)
print('横向分割为:\n',np.hsplit(arr, 2)) #hsplit函数横向分割
print('纵向分割为:\n',np.vsplit(arr, 2)) #vsplit函数纵向分割
print('横向分割为:\n',np.split(arr, 2, axis=1)) #split函数横向分割
print('纵向分割为:\n',np.split(arr, 2, axis=0)) #split函数纵向分割
创建的二维数组为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
横向分割为:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
纵向分割为:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
横向分割为:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
纵向分割为:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]