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

 

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

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在SystemVerilog (sv),合并型数组和非合并型数组的维度可以通过定义数组的方式来确定。合并型数组定义在类型之后,名称之前,维度由方括号表示。非合并型数组定义在名称之后,维度同样由方括号表示。 例如,在sv定义一个合并型数组可以是以下形式: `bit [7:0] b_pack;` 这表示b_pack是一个合并型数组,有3个维度,每个维度的范围是7到0。也就是说,b_pack是一个3行8列的二维数组。 而非合并型数组可以是以下形式: `bit [7:0] b_unpack;` 这表示b_unpack是一个非合并型数组,有3个维度,每个维度的范围是7到0。也就是说,b_unpack是一个由3个一维数组组成的数组,每个一维数组有8个元素。 总结来说,合并型数组和非合并型数组的维度都可以通过方括号来定义,合并型数组的维度定义在类型之后,名称之前,非合并型数组的维度定义在名称之后。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SV之数组类型](https://blog.csdn.net/NJUPTYJS/article/details/130365635)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [一文看懂组合型/非组合型数组](https://blog.csdn.net/qq_42419590/article/details/121127845)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

txh3093

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值