在迭代计算中经常需要以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进行数据收集时,设计出合适的数据形状,以避免数据维度上不知从何入手。