Как сгладить массив объектов в NumPy? - PullRequest
0 голосов
/ 05 июля 2019

У меня есть массив

np.array([[[ 1,  2], [ 3, -4]],[[-1,  0]]], dtype=object)

, и я хочу сгладить его, чтобы получить что-то вроде:

array([1,2,3,-4,-1,0], dtype=int32)

Я попытался Сгладить массив NumPy , но он поднимаетсяЗначение ошибки

Для ясности, мой массив всегда является массивом объектов, состоящим из нескольких 2D и 1D массивов

Ответы [ 4 ]

0 голосов
/ 06 июля 2019

Он вложенный, но вы можете использовать sum() для этого:

nested_list_values = [[[ 1,  2], [ 3, -4]],[[-1,  0]]]
sum(sum(, []), [])

[1, 2, 3, -4, -1, 0]

Или с itertools.chain(), если это кажется более естественным:

from itertools import chain

nested_list_values = [[[ 1,  2], [ 3, -4]],[[-1,  0]]]
list(chain(*chain(*nested_list_values)))

[1, 2, 3, -4, -1, 0]

0 голосов
/ 05 июля 2019

Чтобы просто сгладить вложенный список, вы можете сделать что-то вроде этого (может быть немного проще для понимания, чем в другом примере):

def flatten_list(lst):
   if not lst:
      return []
   elif isinstance(lst[0], list):
      return flatten_list(lst[0]) + flatten_list(lst[1:])
   else:
      return [lst[0]] + flatten_list(lst[1:])
0 голосов
/ 05 июля 2019
In [333]: arr = np.array([[[ 1,  2], [ 3, -4]],[[-1,  0]]], dtype=object)                                       
In [334]: arr                                                                                                   
Out[334]: array([list([[1, 2], [3, -4]]), list([[-1, 0]])], dtype=object)
In [335]: arr.shape                                                                                             
Out[335]: (2,)
In [336]: np.vstack(arr)                                                                                        
Out[336]: 
array([[ 1,  2],
       [ 3, -4],
       [-1,  0]])
In [337]: np.vstack(arr).ravel()                                                                                
Out[337]: array([ 1,  2,  3, -4, -1,  0])
0 голосов
/ 05 июля 2019

Если вы не знаете глубину своего массива nestet, вы можете сделать это следующим образом:

l = np.array([[[ 1,  2],[ 3, -4]], [-1,  0]])

from collections.abc import Iterable

def flatten(l):
    returnlist=[]
    for elem in l:
        if isinstance(elem, Iterable):
            returnlist.extend(flatten(elem))
        else:
            returnlist.append(elem)

    return returnlist

np.array(flatten(l))

Если его 2-мерное, вы можете пойти так, как этот пост предлагает Как сделать плоский список из списка списков :

flat_list = [item for sublist in l for item in sublist]

или просто используйте numpys flatten.

Кстати, ваш пример не является двумерным из-за этих двойных скобок, поэтому также не работает flatten ():

np.array([ [[ 1, 2], [ 3, -4 ]] ,[[-1, 0]]], dtype=object)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...