Очистка и конкатенация двухмерного маскированного массива строк, содержащего своеобразные символы с numpy - PullRequest
0 голосов
/ 05 февраля 2019

При чтении файла netCDF, одна из переменных - это массив строк 2D, который выглядит следующим образом:

[[' ' ' ' ' ' 'B' 'l' 'i' ' ' ' ']
 ['+' -- '\xaa' -- 'F' 'o' 'o' ' ']
 [' ' '1' ']' -- 'B' 'l' 'a' ' ']
 [' ' '\x1a' -- '\x98' -- 'B' 'l' 'o']]

Мой желаемый результат:

['Bli', 'Foo', 'Bla', 'Blo']

Илимассив, содержащий эти слова, или любые итерируемые с чистыми словами (т. е. с удаленными пробелами, специальными символами и т. д.).

Моя проблема:

Мои трудностипроисходят из специальных символов (откуда они берутся и как их удалить?) и из маскированных значений:

import numpy as np

a = np.ma.masked_array([(' ', ' ', ' ', 'B', 'l', 'i', ' ', ' ' ),
                        ('+', ' ', '\xaa', ' ', 'F', 'o', 'o', ' '),
                        (' ', '1', ']', ' ', 'B', 'l', 'a', ' '),
                        (' ', '\x1a', ' ', '\x98', ' ', 'B', 'l', 'o' )],
                       mask=[(0, 0, 0, 0, 0, 0, 0, 0),
                             (0, 1, 0, 1, 0, 0, 0, 0),
                             (0, 0, 0, 1, 0, 0, 0, 0),
                             (0, 0, 1, 0, 1, 0, 0, 0)])

print a
print ''.join(a[0,:]).replace(' ', '')  # this properly produces 'Bli'
print [''.join(i).replace(' ', '') for i in a]

В последней строке выдается следующая ошибка:

TypeError: элемент последовательности 1: ожидаемая строка, найден MaskedConstant

Но даже после устранения этой проблемы я получу нежелательные странные символы в моих строках ...

a[a.mask] = ' '
print [''.join(i).replace(' ', '') for i in a]
# ['Bli', '+\xaaFoo', '1]Bla', '\x1a\x98Blo']

Каков наилучший способ однородной обработки этого массива за одну операцию?

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете использовать это?

    import numpy as np

    a = np.ma.masked_array([(' ', ' ', ' ', 'B', 'l', 'i', ' ', ' ' ),
                            ('+', ' ', '\xaa', ' ', 'F', 'o', 'o', ' '),
                            (' ', '1', ']', ' ', 'B', 'l', 'a', ' '),
                            (' ', '\x1a', ' ', '\x98', ' ', 'B', 'l', 'o' )],
                           mask=[(0, 0, 0, 0, 0, 0, 0, 0),
                                 (0, 1, 0, 1, 0, 0, 0, 0),
                                 (0, 0, 0, 1, 0, 0, 0, 0),
                                 (0, 0, 1, 0, 1, 0, 0, 0)])

    print ''.join(a[0,:]).replace(' ', '')  # this properly produces 'Bli'
    print [''.join(x for x in y if x.isalpha()) for y in [''.join(i).replace(' ', '') for i in a.filled('')]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...