Удалить все не строковые значения в массиве пустых массивов - PullRequest
0 голосов
/ 04 июня 2019

У меня есть массив массивов только со значениями str и nan, например:

x = numpy.recarray(
    [('A', 'B', nan, nan),
     ('B', nan, nan, nan),
     ('A', 'B', 'H', 'Z')],
     dtype=[('D1', 'O'), ('D2', 'O'),  
            ('D3', 'O'), ('D4', 'O')])

и я ищу эффективный способ отбросить все значения nan и остаться с массивами с переменным количеством элементов. Значения nan имеют тип float.

type(x[0][3])
out: float

Спасибо, заранее сметы

1 Ответ

1 голос
/ 04 июня 2019

У вас есть массив данных формы (3,) и 4 поля:

In [85]: x = np.array( 
    ...:     [('A', 'B', np.nan, np.nan), 
    ...:      ('B', np.nan, np.nan, np.nan), 
    ...:      ('A', 'B', 'H', 'Z')], 
    ...:      dtype=[('D1', 'O'), ('D2', 'O'),   
    ...:             ('D3', 'O'), ('D4', 'O')])                                                          
In [86]: x                                                                                               
Out[86]: 
array([('A', 'B', nan, nan), ('B', nan, nan, nan), ('A', 'B', 'H', 'Z')],
      dtype=[('D1', 'O'), ('D2', 'O'), ('D3', 'O'), ('D4', 'O')])
In [87]: x.shape                                                                                         
Out[87]: (3,)
In [88]: x['D1']                                                                                         
Out[88]: array(['A', 'B', 'A'], dtype=object)
In [89]: x['D3']                                                                                         
Out[89]: array([nan, nan, 'H'], dtype=object)

Вы не можете сделать это рваным.

Но вы можете сделать из него 2d массиви затем выполнить понимание списка:

In [93]: xx = np.array(x.tolist())                                                                       
In [94]: xx                                                                                              
Out[94]: 
array([['A', 'B', 'nan', 'nan'],
       ['B', 'nan', 'nan', 'nan'],
       ['A', 'B', 'H', 'Z']], dtype='<U3')
In [95]: [[i for i in row if i!='nan'] for row in xx]                                                    
Out[95]: [['A', 'B'], ['B'], ['A', 'B', 'H', 'Z']]

Мы также можем выполнить понимание элементов структурированного массива:

In [101]: [[i for i in row if i is not np.nan] for row in x]                                             
Out[101]: [['A', 'B'], ['B'], ['A', 'B', 'H', 'Z']]

Элемент x подобен кортежу.Технически это np.void (составная запись dtype), но он повторяется как кортеж.

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