Как преобразовать список 1-D ndarray в 2-D ndarray (mxnet ndarray) - PullRequest
0 голосов
/ 01 сентября 2018

В этом примере у меня есть список 1-го ndarray, с длиной 9, список имеет 9 элементов, и у каждого есть shape=(2048,), так что всего 9 * (2048,), я получаю эти ndarray из mxnet так что каждый из ndarray равен <NDArray 2048 @cpu(0)> массиву dtype=numpy.float32

Если я использую np.asarray для преобразования этого списка, он становится следующим результатом

shape=<class 'tuple'>: (9, 2048, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

Очевидно, мне нужен двумерный массив с shape=(9, 2048), как решить эту проблему?

ps: я обнаружил эту проблему, сохранив файл npy и загрузив его. Я непосредственно сохранил список перед тем, как преобразовать его в ndarray (поэтому np.save преобразует список в ndarrary автоматически), и после загрузки я обнаружил, что форма стала чем-то выше, что действительно ненормально

Ответ ниже, np.vstack и np.array оба работают для общей проблемы от list до ndarray, но не могут решить мою, поэтому я сомневаюсь, что это какой-то особый случай mxnet

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Поскольку парень, который дает правильный ответ в качестве комментария, решает мою проблему, но не публикует ответ, я бы опубликовал его ответ здесь для других, кто также может столкнуться с этой проблемой

На самом деле np.array и mxnet.ndarray не совсем одинаковы, поэтому опасно напрямую вызывать numpy методы для mxnet.ndarray. Чтобы использовать метод numpy в mxnet.ndarray, мы должны сначала преобразовать массив в np.array, то есть

mx_ndarray = mxnet.ndarray.zeros(5)
np_array = mx_ndarray.asnumpy() 

Тогда numpy методы могут быть использованы на np_array

Поскольку приведенный выше ответ носит более общий характер (np.vstack()), я принимаю его и просто публикую этот ответ в качестве ссылки. Также, np.array() делает то же самое в приведенном выше примере с np.vstack()

0 голосов
/ 01 сентября 2018

Вы можете использовать np.vstack. Вот пример:

import numpy as np

li = [np.zeros(2048) for _ in range(9)]
result = np.vstack(li)
print(result.shape)

Это выводит (9, 2048) по желанию.

...