为了简单起见,我有一个尺寸为[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会拒绝我在四元数列表中进行操作。我真的不明白为什么。
您能帮我照一下吗?如何在清单中找到合适的尺寸?我尝试了所有技巧,例如del,remove(),但没有结果...
您似乎正在使用numpy数组(而不是Python列表)。 Numpy不允许更改分配给数组元素的尺寸,因为它会变得不规则(某些条目带有4,有些条目带有3)。
[另外,使用循环遍历numpy数组是使用numpy的错误方法。在这种情况下,您可能正在考虑将quat2expmap函数应用于矩阵的第4维,以生成新的形状矩阵(95,32,31,3)。这将最大程度地利用numpy的并行性,并且可以编写成两行而没有任何循环。
您可以修改quat2expmap函数,使其直接在您的4d矩阵上运行(这将是最快的方法),或者使用np.apply_along_axis(比循环快很多)。