当前位置: 代码迷 >> 综合 >> 一文弄清 Python 中 list 和 array 中的维度问题
  详细解决方案

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

热度:28   发布时间:2024-02-23 06:37:51.0

 

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

1.维度和方括号的关系

重新强调一下基础,在list 和 array中可以将每一层方括号看做一个维度,有多少层方括号就有多少维。

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)# 构建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
b_array = np.array(b_list)print(b_array.shape) # 对于方括号,由外向内的维度数依次为:3,5,1
>>>(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]]# 将行矢量合并为矩阵
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进行数据收集时,设计出合适的数据形状,以避免数据维度上不知从何入手。

  相关解决方案