Конвертировать элементы многомерного массива numy в float32 - PullRequest
0 голосов
/ 22 октября 2019

У меня есть сложный вложенный массив NumPy, который содержит список. Я пытаюсь преобразовать элементы в float32. Тем не менее, это дает мне следующую ошибку:

ValueError                                Traceback (most recent call last)
<ipython-input-225-22d2824961c2> in <module>
----> 1 x_train_single.astype(np.float32)

ValueError: setting an array element with a sequence.

Вот код и пример ввода:

    x_train_single.astype(np.float32)

    array([[ list([[[0, 0, 0, 0, 0, 0]], [-1.0], [0]]),
    list([[[0, 0, 0, 0, 0, 0], [173, 8, 172, 0, 0, 0]], [-1.0], [0]])
   ]])

Ответы [ 3 ]

0 голосов
/ 22 октября 2019

Попробуйте это:

np.array(x_train_single.tolist())   

Похоже, у вас есть массив (1,1) в форме, где единственным элементом является список. И у подписчиков постоянный размер.

Я ожидаю, что вы получите массив с shape (1, 1, 1, 11, 6) и типом int dtype.

или:

np.array(x_train_single[0,0])

Снова это извлекаетсписок из массива, а затем делает массив из этого.

Мой ответ до сих пор был основан на дисплее:

array([[list([[[173, 8, 172, 0, 0, 0], [512, 58, 57, 0, 0, 0],  
     ...: [513, 514, 0, 0, 0, 0], [515, 189, 516, 0, 0, 0], [309, 266, 0, 0, 0, 
     ...: 0],  
     ...: [32, 310, 0, 0, 0, 0], [271, 58, 517, 0, 0, 0], [164, 40, 0, 0, 0, 0],
     ...:  [38, 32, 60, 0, 0, 0], [38, 83, 60, 0, 0, 0], [149, 311, 0, 0, 0, 0]]
     ...: ])]])

Новый дисплей более сложный

array([[ list([[[0, 0, 0, 0, 0, 0]], [-1.0], [0]]), 
     ...:     list([[[0, 0, 0, 0, 0, 0], [173, 8, 172, 0, 0, 0]], [-1.0], [0]])]])                                                                

потому что внутренние списки различаются по размеру. Его нельзя преобразовать в числовой массив dtype.

Его можно превратить в массив формы (1,2,3), но все же объект dtype с элементами списка 1d.

0 голосов
/ 22 октября 2019

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

Вот "сделай работу, неважно, что"подход. Он поставляется в двух вариантах. Один создает массивы для листьев, другой перечисляет.

>>> a
array([[list([[[0, 0, 0, 0, 0, 0]], [-1.0], [0]]),
        list([[[0, 0, 0, 0, 0, 0], [173, 8, 172, 0, 0, 0]], [-1.0], [0]])]],
      dtype=object)

>>> def mkarr(a):
...     try:
...         return np.array(a,np.float32)
...     except:
...         return [*map(mkarr,a)]
... 
>>> def mklst(a):
...     try:
...         return [*map(mklst,a)]
...     except:
...         return np.float32(a)
... 

>>> np.frompyfunc(mkarr,1,1)(a)
array([[list([array([[0., 0., 0., 0., 0., 0.]], dtype=float32), array([-1.], dtype=float32), array([0.], dtype=float32)]),
        list([array([[  0.,   0.,   0.,   0.,   0.,   0.],
       [173.,   8., 172.,   0.,   0.,   0.]], dtype=float32), array([-1.], dtype=float32), array([0.], dtype=float32)])]],
      dtype=object)

>>> np.frompyfunc(mklst,1,1)(a)
array([[list([[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]], [-1.0], [0.0]]),
        list([[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [173.0, 8.0, 172.0, 0.0, 0.0, 0.0]], [-1.0], [0.0]])]],
      dtype=object)
0 голосов
/ 22 октября 2019

, если количество столбцов фиксировано, то

np.array([l.astype(np.float) for l in x_train_single.squeeze()])

Но это удалит лишние измерения, преобразует все в массив numpy.

До: (1, 1, 1, 11, 6)

После: (11,6)

...