выбрать данные из матрицы
Есть матрица. Как выбрать определенные элементы из нее? Сначала пройтись по последнему столбцу и выбрать все строки где элементы в диапазоне от 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 шт):
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