主要内容:

一、修改数组的形状

1、重塑数组形状

  • reshape()
  • resize()
  • shape

2、多维数换向一维数组转换

  • ravel()
  • flatten()
  • reshape(-1)

3、增加一维

  • newaxis()

4、行列转置

  • T
  • transpose
  • swapaxes

二、数据合并

  • np.hstack()
  • np.vstack()
  • np.concatenate()

三、数组的复制

  • np.tile()

首先理解一下numpy中的坐标系

0代表行,1代表列

python 数组交换维度 numpy数组维度转换_python 数组交换维度





一、修改数组的形状



1、重塑数组形状

方法

作用

reshape()

不修改原数组的形状,返回一个视图,会影响原数组的数据

resize()

直接作用于原数组

shape()

直接作用于原数组

若不理解视图,可以通过 视图与拷贝 这篇博客进行了解。



ndarry.reshape()
ndarry.reshape(shape)
shape:填入生成的数组形状(元组)

特点:
1、有返回值,返回一个视图
2、不直接作用于原数组(不改变原数组的形状),但影响原数组的元素

代码:

import numpy as np

n1 = np.array([[2,4,3,2],[8,4,2,9],[8,3,4,9]])

# 形状
n1.shape
# (3, 4)

# reshape
n1.reshape((4,3))

out:

python 数组交换维度 numpy数组维度转换_python 数组交换维度_02



ndarry.resize()
'''
resize(shape) :谨慎使用!

shape:填入生成的数组形状(元组)

特点:
1、无返回值
2、直接作用于原数组(改变原数组的形状)
'''
n1 = np.array([[2,4,3,2],[8,4,2,9],[8,3,4,9]])
n1.resize(2,2,3)

# n1形状已修改
n1.shape
# (2, 2, 3)



ndarry.shape
'''
shape
通过属性直接赋值修改(改变原数组的形状)
'''
n1 = np.array([[2,4,3,2],[8,4,2,9],[8,3,4,9]])

# 数组的原始形状
n1.shape
# (4, 3)

n1.shape = (2,6)
n1

out:

python 数组交换维度 numpy数组维度转换_数据_03



2、多维数换向一维数组转换



ndarry.ravel()
'''
ndarry.ravel(order=)

当不设置参数order,默认将数组横向展平为一维数组
当设置参数order = 'F',即为将数组纵向展平为一维数组

注意:
    使用ravel函数修改形状,得到一个视图,不会改变原数组的形状,但会会改变原数组中的元素!
'''
n1
# array([[2, 4, 3],
#        [2, 8, 4],
#        [2, 9, 8],
#        [3, 4, 9]])

# 横向展平为一维数组
n1.ravel()
# array([2, 4, 3, 2, 8, 4, 2, 9, 8, 3, 4, 9])

# 纵向展平为一维数组
n1.ravel(order='F')
# array([2, 2, 2, 3, 4, 8, 9, 4, 3, 4, 8, 9])

# 原数组形状未改变
n1
# array([[2, 4, 3],
#        [2, 8, 4],
#        [2, 9, 8],
#        [3, 4, 9]])

# 修改元素
n1.ravel()[3] = 77

# 原数组数据被修改
n1
# array([[ 2,  4,  3],
#        [77,  8,  4],
#        [ 2,  9,  8],
#        [ 3,  4,  9]])



ndarry.flatten()
'''
ndarry.flatten(order=)

当不设置参数order,默认为将数组横向展平为一维数组
当设置参数order = 'F',则将数组纵向展平为一维数组

注意:
    使用flatten函数不会对原数组产生任何影响
    (原数组形状和元素都不受其影响)
'''
n1
# array([[ 2,  4,  3],
#        [77,  8,  4],
#        [ 2,  9,  8],
#        [ 3,  4,  9]])

# # 将数组横向展平成一维数组
n1.flatten()
# array([ 2,  4,  3, 77,  8,  4,  2,  9,  8,  3,  4,  9])

# 展平时候的形状
n1.flatten().shape
# (12,)

# 将数组纵向展平成一维数组
n1.flatten(order='F')
# array([ 2, 77,  2,  3,  4,  8,  9,  4,  3,  4,  8,  9])

# flatten修改元素数值
n1.flatten()[1] = 6
# 不影响原数组的形状和元素数据
n1
# array([[ 2,  4,  3],
#        [77,  8,  4],
#        [ 2,  9,  8],
#        [ 3,  4,  9]])



ndarry.reshape(-1)

函数说明

'''
n1.reshape(-1)
-1:表示自动计算

n1.reshape(m,-1)
指定行为m,列自动计算

n1.reshape(-1,n)
指定列为n,行自动计算

注意:
    1、不影响原数组的形状
    2、影响原数组的元素
'''

代码:

n1
# array([[ 2,  4,  3],
#        [77,  8,  4],
#        [ 2,  9,  8],
#        [ 3,  4,  9]])

# 横向展平
n1.reshape(-1)
# array([ 2,  4,  3, 77,  8,  4,  2,  9,  8,  3,  4,  9])

# 同n1.reshape(-1) 数组只有一个维度,自动计算长度
n1.reshape(-1,)
# array([ 2,  4,  3, 77,  8,  4,  2,  9,  8,  3,  4,  9])

# 指定列数,自动计算行数
n1.reshape(-1,6)
# array([[ 2,  4,  3, 77,  8,  4],
#        [ 2,  9,  8,  3,  4,  9]])

# 指定行数
n1.reshape(3,-1)
# array([[ 2,  4,  3, 77],
#        [ 8,  4,  2,  9],
#        [ 8,  3,  4,  9]])

# 不改变原数组的形状
n1
# array([[ 2,  4,  3],
#        [77,  8,  4],
#        [ 2,  9,  8],
#        [ 3,  4,  9]])

# 通过reshape修改元素,原数组元素数据产生变化
n1.reshape(-1,)[0] = 12
n1
# array([[12,  4,  3],
#        [77,  8,  4],
#        [ 2,  9,  8],
#        [ 3,  4,  9]])



3、 增加一个维度



np.newaxis() 所在位置增加一个维度

一维扩展为二维

# 一维度数组
n2 = np.arange(10)
n2
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

n2.shape
# (10,)

# 行方向增加一个维度
n2[np.newaxis,:]
# array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])

n2[np.newaxis,:].shape
# (1, 10)

# 列方向增加一个维度
n2[:,np.newaxis]
# array([[0],
#        [1],
#        [2],
#        [3],
#        [4],
#        [5],
#        [6],
#        [7],
#        [8],
#        [9]])

n2[:,].shape
# (10, 1)

二维扩展为三维

# 二维度数组
n2 = np.arange(10).reshape(2,5)
n2.shape
# (2, 5)

n2[np.newaxis,:,:]
# array([[[0, 1, 2, 3, 4],
#         [5, 6, 7, 8, 9]]])

n2[np.newaxis,:,:].shape
# (1, 2, 5)

以此类推,将小维度数组扩展成更多维的数组。



4、数组行列转置



ndarray.T 属性
n2
# array([[0, 1, 2, 3, 4],
#        [5, 6, 7, 8, 9]])

'''
ndarray.T 将数据按照对角线进行行列倒置,行变成了列,列变成了行
'''
n2.T
# array([[0, 5],
#        [1, 6],
#        [2, 7],
#        [3, 8],
#        [4, 9]])



ndarray.transpose()
# 同ndarray.T 
n2.transpose()
# array([[0, 5],
#        [1, 6],
#        [2, 7],
#        [3, 8],
#        [4, 9]])



ndarray.swapaxes(1,0)
# 必须填入两个参数,进行行列转换
n2.swapaxes(1,0)
# array([[0, 5],
#        [1, 6],
#        [2, 7],
#        [3, 8],
#        [4, 9]])



二、数据的拼接(合并)



np.hstack() 水平拼接
'''
np.hstack(tup) 数组的水平拼接
水平拼接即为横向拼接,数组的行数要一致

tup:ndarray序列
'''
# 准备数组1
a1 = np.array([[3,4,5],[2,4,1],[8,9,4]])
a1
# array([[3, 4, 5],
#        [2, 4, 1],
#        [8, 9, 4]])

# 准备数组2
a2 = np.array([[7,3,1,5],[3,9,4,1],[2,8,7,4]])
a2
# array([[7, 3, 1, 5],
#        [3, 9, 4, 1],
#        [2, 8, 7, 4]])

# 进行水平拼接
np.hstack([a1,a2])
# array([[3, 4, 5, 7, 3, 1, 5],
#        [2, 4, 1, 3, 9, 4, 1],
#        [8, 9, 4, 2, 8, 7, 4]])



np.vstack() 竖直拼接
'''
np.vstack(tup) 数组的水平拼接
竖直拼接即为纵向拼接,数组的列数要一致

tup:ndarray序列
'''
# 准备数组1
a2 = np.array([[7,3,1,5],[3,9,4,1],[2,8,7,4]])
a2
# array([[7, 3, 1, 5],
#        [3, 9, 4, 1],
#        [2, 8, 7, 4]])

# 准备数组2
a3=np.arange(12).reshape(3,4)
# array([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11]])

# 进行竖直拼接
np.vstack((a3,a2))
# array([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11],
#        [ 7,  3,  1,  5],
#        [ 3,  9,  4,  1],
#        [ 2,  8,  7,  4]])



np.concatenate() 指定数组的拼接方向
'''
np.concatenate((a1, a2, ...), axis=0, out=None)

axis = 0 :按照行的方向进行拼接,竖直拼接
axis = 1 :按照列的方向进行拼接,横向拼接

'''
# 准备数组1
a1 = np.array([[3,4,5],[2,4,1],[8,9,4]])
a1
# array([[3, 4, 5],
#        [2, 4, 1],
#        [8, 9, 4]])

# 准备数组2
a2 = np.array([[7,3,1,5],[3,9,4,1],[2,8,7,4]])
a2
# array([[7, 3, 1, 5],
#        [3, 9, 4, 1],
#        [2, 8, 7, 4]])

# 按照列的方向进行拼接,横向拼接
np.concatenate((a1,a2),axis = 1)
# array([[3, 4, 5, 7, 3, 1, 5],
#        [2, 4, 1, 3, 9, 4, 1],
#        [8, 9, 4, 2, 8, 7, 4]])

# 准备数组3
a3=np.arange(12).reshape(3,4)
# array([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11]])

# 按照行的方向进行拼接,竖直拼接
np.concatenate((a3,a2),axis = 0)
# array([[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11],
#        [ 7,  3,  1,  5],
#        [ 3,  9,  4,  1],
#        [ 2,  8,  7,  4]])



( 三)、数据的复制



np.tile(ndarry,(m,n)) 指定数组的方向复制
'''
np.tile(ndarry,(m,n))
tile是瓷砖的意思,顾名思义,这个函数就是把数组像瓷砖一样铺展开来。
m:表示按照行的方向进行复制,铺展m次
m:表示按照列的方向进行复制,铺展n次
'''

a2
# array([[7, 3, 1, 5],
#        [3, 9, 4, 1],
#        [2, 8, 7, 4]])

# 按照行的方向进行复制,铺展3次,竖直铺展
np.tile(a2,(3,1))
# array([[7, 3, 1, 5],
#        [3, 9, 4, 1],
#        [2, 8, 7, 4],
#        [7, 3, 1, 5],
#        [3, 9, 4, 1],
#        [2, 8, 7, 4],
#        [7, 3, 1, 5],
#        [3, 9, 4, 1],
#        [2, 8, 7, 4]])

# 按照列的方向进行复制,铺展2次,横向铺展
np.tile(a2,(1,2))
# array([[7, 3, 1, 5, 7, 3, 1, 5],
#        [3, 9, 4, 1, 3, 9, 4, 1],
#        [2, 8, 7, 4, 2, 8, 7, 4]])

# 分别按照行列方向进行铺展
np.tile(a2,(2,3))
# array([[7, 3, 1, 5, 7, 3, 1, 5, 7, 3, 1, 5],
#        [3, 9, 4, 1, 3, 9, 4, 1, 3, 9, 4, 1],
#        [2, 8, 7, 4, 2, 8, 7, 4, 2, 8, 7, 4],
#        [7, 3, 1, 5, 7, 3, 1, 5, 7, 3, 1, 5],
#        [3, 9, 4, 1, 3, 9, 4, 1, 3, 9, 4, 1],
#        [2, 8, 7, 4, 2, 8, 7, 4, 2, 8, 7, 4]])