一文弄清 Python 中 list 和 array 中的维度问题

您所在的位置:网站首页 python把一维数组变成二维矩阵怎么办 一文弄清 Python 中 list 和 array 中的维度问题

一文弄清 Python 中 list 和 array 中的维度问题

2024-07-13 17:16| 来源: 网络整理| 查看: 265

 

在迭代计算中经常需要以list的形式append新的行或列矢量数据进来,而在后续计算时有需要将list转换为二维array矩阵进行计算,list转array会多出一个维度,令人困扰,现进行一些案例,弄清相关的维度问题。(对于从MATLAB转过来的同学们,这应该是N多的坑之一)

1.维度和方括号的关系

重新强调一下基础,在list 和 array中可以将每一层方括号看做一个维度,有多少层方括号就有多少维。由外向内打开方括号,逗号隔开的元素个数就是当前维度的长度,第一层方括号的元素个数为第0个维度的长度,第一个方括号的元素个数为第1个维度的长度,依次类推。

a=np.array([1,2,3]) # 一维元素个数为3,阶次(3,) a=np.array([[1], [2], [3]]) # 二维 由外向内每层元素个数依次为:3,1 因此为3*1阶 a=np.array([ [[1], [2], [3]], [[1], [2], [3]] ]) # 三维 由外向内解开方括号,依次得到元素的个数为:2,3,1,因此阶数为(2,3,1) 2.list转为array时的维度继承

从方括号的角度,将list转为array时,维度是继承过来的,也就是说list维度分布是什么,得到的array的维度就是什么。但前提是list中每个元素的数据结构相同,例如:list中每个元素都是(100,1)维的 array 。数据结构的长度不同在转换成array的时候会出现问题。后续讨论都将默认数据结构是相同的。

首先给出案例展示list转array时的维度继承(list只用长度描述,不存在多维问题,在此为方便解释,暂依据方括号的结构,赋予其“维度”的概念)

import numpy as np # # 4*4矩阵 # a = np.array(np.arange(16).reshape(-1,4)) # 构建长度为 3 的list,每个元素都包含一个长度为2的子list a_list = [[1,2], [2,3], [3,4]] a_array = np.array(a_list) # 对于方括号,由外向内的维度数依次为:3,2 print(a_array.shape) # 得到(1,3,2)的array >>>(3,2) print(a_array) >>>[[1,2], [2,3], [3,4]] # 构建3维list a_list3=[a_array] # 共含有3层方括号 a_array3 = np.array(a_list3) # 对于方括号,由外向内的维度数依次为:1,3,2 print(a_array3.shape) # 得到(1,3,2)阶的array >>>(1,3,2)

从代码中可以看出,list转换为array后继承了list的每一层的方括号结构。

3.将二维矢量组成的列表合并成矩阵

案例代码如下:

import numpy as np # 将列矢量合并为矩阵 b_list=[] for i in range(3): b_list.append(np.arange(5).reshape(-1,1)) #加入(5,1)阶 array print(b_list) >>>[array([[0], [1], [2], [3], [4]]), array([[0], [1], [2], [3], [4]]), array([[0], [1], [2], [3], [4]])] # 长度为3的list,每个元素为2维矩阵 b_array = np.array(b_list) print(b_array.shape) # 对于方括号,由外向内的维度数依次为:3,5,1 >>>(3,1,5) print(b_array) >>>[[[0] [1] [2] [3] [4]] [[0] [1] [2] [3] [4]] [[0] [1] [2] [3] [4]]] # 得到3维矩阵 print(b_array[:,:,0].shape) # 对于方括号,由外向内的维度数依次为:3,5 >>>(3,5) print(b_array[:,:,0]) >>>[[0 1 2 3 4] [0 1 2 3 4] [0 1 2 3 4]] # 将行矢量合并为矩阵 b_list=[] for i in range(3): b_list.append(np.arange(5).reshape(1,-1)) #加入(1,5)阶 array b_array = np.array(b_list) print(b_array.shape) # 对于方括号,由外向内的维度数依次为:3,1,5 >>>(3,1,5) print(b_array[:,0,:].shape) # 对于方括号,由外向内的维度数依次为:3,5 >>>(3,5) print(b_array[:,0,:]) >>>[[0 1 2 3 4] [0 1 2 3 4] [0 1 2 3 4]]

无论是通过list收集行向量还是列向量,只要掌握了list的方括号结构,就知道了得到的array的维度,最后都能从3维中抽取出想要的2维array矩阵。list收集的2维列矢量转为3为矩阵后,需要对最后一个维度进行展开得到含有所有数据的二维矩阵;list收集的2维行矢量转为3为矩阵后,需要对倒数第二个维度进行展开得到含有所有数据的二维矩阵。

进一步,对于通过list 收集二维(a,b)阶array的情况,若收集的长度为n,则list转换为array后得到的矩阵形状为(n,a,b)阶,更高维度的数据该结论同样适用。

通过该结论,可在使用list进行数据收集时,设计出合适的数据形状,以避免数据维度上不知从何入手。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3