Фильтровать строки отсортированного массива NumPy по порядку значений в списке - PullRequest
1 голос
/ 11 ноября 2019

Я пытаюсь перебрать массив NumPy для создания списка списков, но используемый цикл for добавляет список списков в алфавитном порядке, а не в порядке появления.

Вотчасть моего массива NumPy, которую я могу использовать в качестве примера:

tarifas = np.array([['Afganistán', '577.21', '0.9360168799091559', '1.01745744495737'],
                    ['Albania', '5450.0', '1.1439867079655244', '0.9195410037811979'],
                    ['Alemania', '49690', '1.0034542200895549', '0.9873874704432137'],
                    ['Angola', '3670.0', '0.931103978746121', '1.162652536895962'],
                    ['Antigua y Barbuda', '18170', '0.7795684991736309', '0.6399312443495023'],
                    ['Arabia Saudita', '23490', '1.0573676413333202', '0.7477763277701148'],
                    ['Argelia', '4650.0', '0.7969840140783656', '0.5123046862189027'],
                    ['Argentina', '9050.0', '1.3647162509775996', '0.48274125735042017'],
                    ['Armenia', '4450.0', '1.4545784506262867', '1.430465487479917'],
                    ['Australia', '57200', '0.7293018985322222', '1.1744384938116095'],
                    ['Austria', '52470', '1.2396562976033307', '0.8630735107719588'],
                    ['Azerbaiyán', '4780.0', '0.9111186496911305','0.534268284966654']])

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

list_countries = ["Angola", "Austria", "Argentina", "Albania", "Armenia"]

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

new_list_of_countries = [['Angola' '3670.0' '0.931103978746121' '1.162652536895962'], 
                         ['Austria' '52470' '1.2396562976033307' '0.8630735107719588'],  
                         ['Argentina' '9050.0' '1.3647162509775996' '0.48274125735042017'], 
                         ['Albania' '5450.0' '1.1439867079655244' '0.9195410037811979'], 
                         ['Armenia' '4450.0' '1.4545784506262867' '1.430465487479917']]

Вот код, который я использовал:

tarifas_paises_escogidos = []
for i in tarifas:
    for v in list_countries:
         if str(v) in str(i):
               tarifas_paises_escogidos.append(i)
print(np.array(tarifas_paises_escogidos))

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Использование понимания списка с sorted:

sorted([t for t in tarifas if t[0] in list_countries], 
        key=lambda x: list_countries.index(x[0]))

Вывод:

[['Angola', '3670.0', '0.931103978746121', '1.162652536895962'],
 ['Austria', '52470', '1.2396562976033307', '0.8630735107719588'],
 ['Argentina', '9050.0', '1.3647162509775996', '0.48274125735042017'],
 ['Albania', '5450.0', '1.1439867079655244', '0.9195410037811979'],
 ['Armenia', '4450.0', '1.4545784506262867', '1.430465487479917']]

Один без использования понимания списка:

tarifas_paises_escogidos = []
for t in tarifas:
    # for v in list_countries: You don't need this
    if t[0] in list_countries:
        tarifas_paises_escogidos.append(t)
print(tarifas_paises_escogidos)

, что приводит к фильтрации, ноunsorted:

[['Albania', '5450.0', '1.1439867079655244', '0.9195410037811979'], 
 ['Angola', '3670.0', '0.931103978746121', '1.162652536895962'], 
 ['Argentina', '9050.0', '1.3647162509775996', '0.48274125735042017'], 
 ['Armenia', '4450.0', '1.4545784506262867', '1.430465487479917'], 
 ['Austria', '52470', '1.2396562976033307', '0.8630735107719588']]

Затем вы сортируете (и присваиваете его обратно!):

tarifas_paises_escogidos = sorted(tarifas_paises_escogidos, key=lambda x: list_countries.index(x[0]))

, что дает вышеприведенный вывод.

Insight:

В lambda выше x почти ничего не значит. Это просто означает, что то, что получает ввод lambda, определяется как x и используется для индексации (то есть x[0]).

Он идентичен:

def some_func(x):
    return list_countries.index(x[0])

, затем используется в sorted:

tarifas_paises_escogidos = sorted(tarifas_paises_escogidos, key=some_func)

Но вы часто можете найти определение функции только для одного варианта использования вполненеэффективен. Это когда lambda начинает:).

0 голосов
/ 11 ноября 2019

Поскольку исходный массив NumPy, tarifas, отсортирован по алфавиту, вы можете использовать np.searchsorted, чтобы получить индексы, соответствующие list_countries:

indices = np.searchsorted(tarifas[:, 0], list_countries)
print(indices)
# [ 3 10  7  1  8]

изатем используйте fancy indexing (индексирование массивов с использованием массивов), чтобы получить желаемый результат:

result = tarifas[indices]
print(result)
# [['Angola' '3670.0' '0.931103978746121' '1.162652536895962']
#  ['Austria' '52470' '1.2396562976033307' '0.8630735107719588']
#  ['Argentina' '9050.0' '1.3647162509775996' '0.48274125735042017']
#  ['Albania' '5450.0' '1.1439867079655244' '0.9195410037811979']
#  ['Armenia' '4450.0' '1.4545784506262867' '1.430465487479917']]

Для больших массивов этот векторизованный подход должен быть намного быстрее, чем решение, использующее циклы for Python из ответ Криса .

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