如何从多维数组中删除项目?

问题描述 投票:0回答:1

为了简单起见,我有一个尺寸为[32,31,4]的列表,我希望将其缩小为形状[32,31,3],以便用大小为(3)的数组。

        for a in range(len(liste)):                #len(list) = 95
        for b in range(len(liste[a])):             #shape = [32, 31, 3], b travels in the 1st dim.
            #print('frame : ', liste[a][b].shape)  #[31, 4]
            #print('b', b)                         #32 frames each time ok              
            for c in range(len(liste[a][b])):      

                #print('c', c)                      #31 each time ok
                #print('norme du quaternion', np.abs(np.linalg.norm(liste[a][b][c]))) #norm = 1      
                r = quat2expmap(liste[a][b][c])   #convertion to expmap successful
                #print('ExpMap : ', r)  

                quat = liste[a][b][c]
                quat = r                #this works

                #print('quat', quat)


                liste[a][b][c] = r      #this doesn't work  

更确切地说,我有95个不同手势的数据集,每个手势均由32个帧和四元数表示。我将四元数转换为ExpMap,但是由于形状的差异,我无法用其对应的ExpMap替换四元数。我收到最多的错误代码如下:

ValueError: could not broadcast input array from shape (3) into shape (4)

它来自代码的最后一行。最奇怪的是,当我拆开四元数并替换它时,它可以完美地工作,但是python会拒绝我在四元数列表中进行操作。我真的不明白为什么。

您能帮我照一下吗?如何在清单中找到合适的尺寸?我尝试了所有技巧,例如delremove(),但没有结果...

python arrays list quaternions dimension
1个回答
0
投票

您似乎正在使用numpy数组(而不是Python列表)。 Numpy不允许更改分配给数组元素的尺寸,因为它会变得不规则(某些条目带有4,有些条目带有3)。

[另外,使用循环遍历numpy数组是使用numpy的错误方法。在这种情况下,您可能正在考虑将quat2expmap函数应用于矩阵的第4维,以生成新的形状矩阵(95,32,31,3)。这将最大程度地利用numpy的并行性,并且可以编写成两行而没有任何循环。

您可以修改quat2expmap函数,使其直接在您的4d矩阵上运行(这将是最快的方法),或者使用np.apply_along_axis(比循环快很多)。

© www.soinside.com 2019 - 2024. All rights reserved.