Конвертировать 2D массив в 3D массив NumPy - PullRequest
0 голосов
/ 17 июня 2019

У меня есть созданный массив numpy, каждый элемент массива содержит массив одинаковой формы (9,5). То, что я хочу, это трехмерный массив.

Я пытался использовать np.stack.

data = list(map(lambda x: getKmers(x, 9), data)) # getKmers creates a       
                                                 # list of list from a pandas dataframe
data1D = np.array(data)                          # shape (350,)
data2D = np.stack(data1D)

data1D:
array([list([      pdbID  AtomNo Type      Eta    Theta
0  1a9l.pdb     2.0    G  169.225  212.838
1  1a9l.pdb     3.0    G  168.439  206.785
2  1a9l.pdb     4.0    U  170.892  205.845
3  1a9l.pdb     5.0    G  164.726  225.982
4  1a9l.pdb     6.0    A  308.788  144.370
5  1a9l.pdb     7.0    C  185.211  209.363
6  1a9l.pdb     8.0    U  167.612  216.614
7  1a9l.pdb     9.0    C  168.741  219.239
8  1a9l.pdb    10.0    C  163.639  207.044,       pdbID  AtomNo Type          Eta    Theta
1  1a9l.pdb     3.0    G  168.439  206.785
2  1a9l.pdb     4.0    U  170.892  205.845
3  1a9l.pdb     5.0    G  164.726  225.982
4  1a9l.pdb     6.0    A  308.788  144.370
5  1a9l.pdb     7.0    C  185.211  209.363
6  1a9l.pdb     8.0    U  167.612  216.614
7  1a9l.pdb     9.0    C  168.741  219.239
8  1a9l.pdb    10.0    C  163.639  207.044

Я получаю эту ошибку: невозможно скопировать последовательность размером 9 на ось массива с размером 5

Я хочу создать 3D-матрицу, где каждый подмассив находится в новом 3D-измерении. Я предполагаю, что новая форма будет (9,5350)

Ответы [ 3 ]

0 голосов
/ 17 июня 2019

Если вы хотите создать трехмерную матрицу, в которой каждый подмассив находится в новом трехмерном измерении, не будет ли окончательная форма (350,9,5)? В этом случае вы можете просто использовать:

new_array = np.asarray(data).reshape(350,9,5)
0 голосов
/ 18 июня 2019

Из вашего вопроса видно, что getKmers (x, 9) создает список из 9 списков длиной 350, а вход data состоит из 5 элементов. Вы хотите (9, 5, 350) массив из этого. Это должно быть достигнуто с помощью:

arr = np.swapaxes([getKermers(x, 9) for x in data], 0, 1)

Обратите внимание, что swapaxes - это не то же самое, что изменение формы. Если бы вы просто сделали np.array([getKermers(x, 9) for x in data]).reshape(9, 5, 350), вы бы получили желаемую форму вывода, но ваши данные были бы в неправильном порядке.

0 голосов
/ 17 июня 2019

Вам необходимо использовать

 data.reshape((data.shape[0], data.shape[1], 1))

Пример

from numpy import array
data = [[11, 22],
    [33, 44],
    [55, 66]]
data = array(data)
print(data.shape)
data = data.reshape((data.shape[0], data.shape[1], 1))
print(data.shape)

При запуске примера сначала печатается размер каждогоизмерение в двумерном массиве, изменяет форму массива, затем суммирует форму нового трехмерного массива.

Результат

(3,2)
(3,2,1)

Источник: https://machinelearningmastery.com/index-slice-reshape-numpy-arrays-machine-learning-python/

...