Numpy简易教程4——变换数组的形态

变换数组的形态

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提供了hsplitvsplitdsplitsplit函数,可以将数组分割成相同大小的子数组,也可以指定原数组中需要分割的位置。

使用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]])]

Guess you like

Origin blog.csdn.net/mighty13/article/details/119580144