Как удалить элемент из многомерного массива? - PullRequest
0 голосов
/ 15 апреля 2020

Чтобы просто сказать это, у меня есть список измерения [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 () , но не получил результата ...

1 Ответ

0 голосов
/ 15 апреля 2020

Вы, похоже, используете numpy массивы (не Python списки). Numpy не позволяет изменять измерения при присвоении элементу массива, потому что он стал бы неправильным (некоторые записи с 4 и некоторые с 3).

Кроме того, перебор массивов numpy с использованием циклов является неправильным способом использования numpy. В этом случае вы, вероятно, смотрите на применение функции quat2expmap к 4-му измерению вашей матрицы, чтобы получить новую матрицу формы (95,32,31,3). Это максимально использует параллелизм numpy и может быть записано в пару строк без каких-либо циклов.

Вы можете либо изменить функцию quat2expmap, чтобы она работала непосредственно с вашей 4d-матрицей (будет самый быстрый подход) или используйте np.apply_along_axis (который не намного быстрее, чем циклы).

...