Чтение массива numpy как все строчные - PullRequest
0 голосов
/ 22 марта 2019

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

my_dict = {'project': [['Address', 'STREET', '123 N Main St'],
                       ['Address', 'STREET', '100 N Main St']]}

Я хотел бы проверить, существует ли значение в одном из списков, и я исторически использовал

for table in my_dict:
    if 'somevalue' in np.array(my_dict[table]):
        # do something

Это сработало нормально, но теперь, когда списки стали большими, появляются двойные значения.Я хотел бы .lower() все в массиве, а также строку для чтения ради.Нечто подобное не работает так, как я хочу:

for table in my_dict:
    if 'somevalue'.lower() in np.array(my_dict[table]).lower():
        # do something

Ответы [ 3 ]

1 голос
/ 23 марта 2019

Нет смысла создавать np.array здесь, это только замедляет процесс.Если ваше беспокойство сводит ваши списки списков, itertools.chain.from_iterable - это один из аккуратных способов добиться этого:

from itertools import chain
from timeit import timeit

a = [['Address', 'STREET', '123 N Main St'],
     ['Address', 'STREET', '100 N Main St']]

timeit(lambda: 'STREET' in np.array(a))
# 5.389413919008803
timeit(lambda: 'STREET' in chain.from_iterable(a))
# 0.29813046095659956

Для строчных букв используйте map

'street' in map(str.lower, chain.from_iterable(a))
# True

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

'street' in (y.lower() for x in a for y in x)
# True

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

'street' in [y.lower() for x in a for y in x]
# True
0 голосов
/ 23 марта 2019

np.char имеет множество функций, которые применяют строковые методы к элементам массива. Они предназначены скорее для удобства, чем для скорости:

In [116]: arr = np.array(my_dict['project'])                                    
In [117]: arr                                                                   
Out[117]: 
array([['Address', 'STREET', '123 N Main St'],
       ['Address', 'STREET', '100 N Main St']], dtype='<U13')
In [118]: np.char.lower(arr)                                                    
Out[118]: 
array([['address', 'street', '123 n main st'],
       ['address', 'street', '100 n main st']], dtype='<U13')

Или другая функция:

In [119]: np.char.capitalize(arr)                                               
Out[119]: 
array([['Address', 'Street', '123 n main st'],
       ['Address', 'Street', '100 n main st']], dtype='<U13')
0 голосов
/ 22 марта 2019

Я нашел немного решения (не уверен, что это самый быстрый или лучший способ, но он работает). Я создал еще один массив для его чтения, например:

for table in my_dict:
    if 'somevalue'.lower() in np.array([[x.lower() for x in a] for a in my_dict[table]]):
        # do something
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...