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

How to remove an item from a multi-dimentional array?

为了简单地说,我有一个维数 [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() 但没有结果...

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

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

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