выбрать данные из матрицы

Есть матрица. Как выбрать определенные элементы из нее? Сначала пройтись по последнему столбцу и выбрать все строки где элементы в диапазоне от 25 до 25+20% Далее уже из полученного результата отобрать из предпоследнего столбца от 5 до 5 плюс минус 30% И полученные строки, в точнее первый столбец полученных данных вывести на экран.

arr1 = np.array([
    ["item1", 0.11, 220, 1.2,96],
    ["item2",  0.10, 220, 1.3,82],
    ["item3", 0.09, 220, 1.5,61],
    ["item4",0.07, 220, 1.86,35],
    ["item5", 0.26, 220, 2.61, 100],
    ["item6", 0.23, 220, 2.92,80],
    ["item7", 0.20, 220, 3.37,60],
    ["item8", 0.16, 220, 4.12,40],
    ["item9", 0.14, 220, 4.8,30],
    ["item10", 0.52, 220, 5.22,100],
    ["item11", 0.46, 220, 5.84,80],
    ["item12", 0.40, 220, 6.74,60],
    ["item13", 0.10, 220, 6.8,15],
    ["item14", 0.33, 220, 8.24,40],
    ["item15", 0.29, 220, 9.61,30],
    ["item16", 1.04, 220, 10.44,100]
]
)

Ответы (1 шт):

Автор решения: MaxU

Numpy приводит все данные к единому (общему) типу данных. Т.к. у вас в данных присутствуют строки, то и все остальные элементы во всех столюцах будут преобразованы в строки, что делает вашу задачу практически нерешаемой в рамках Numpy без использования уродливых "костылей".

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

import pandas as pd

df = pd.DataFrame(arr1).set_index(0).astype(float).add_prefix("col")
res = df.query("25 <= col4 <= 25*1.2 and 5*.07 <= col3 <= 5*1.3").index.to_list()

результат:

In [97]: res
Out[97]: ['item9']

после преобразования исходной Numpy матрицы в Pandas.DataFrame:

In [98]: df
Out[98]: 
        col1   col2   col3   col4
0                                
item1   0.11  220.0   1.20   96.0
item2   0.10  220.0   1.30   82.0
item3   0.09  220.0   1.50   61.0
item4   0.07  220.0   1.86   35.0
item5   0.26  220.0   2.61  100.0
item6   0.23  220.0   2.92   80.0
item7   0.20  220.0   3.37   60.0
item8   0.16  220.0   4.12   40.0
item9   0.14  220.0   4.80   30.0
item10  0.52  220.0   5.22  100.0
item11  0.46  220.0   5.84   80.0
item12  0.40  220.0   6.74   60.0
item13  0.10  220.0   6.80   15.0
item14  0.33  220.0   8.24   40.0
item15  0.29  220.0   9.61   30.0
item16  1.04  220.0  10.44  100.0

In [99]: df.dtypes
Out[99]: 
col1    float64
col2    float64
col3    float64
col4    float64
dtype: object
→ Ссылка