In [86]: txt='''0.01 1 0.1 1 10 100 a
...: 0.02 3 0.2 2 20 200 b
...: 0.03 2 0.3 3 30 300 c
...: 0.04 1 0.4 4 40 400 d'''
In [87]: A = np.genfromtxt(txt.splitlines(), dtype=str)
In [88]: A
Out[88]:
array([['0.01', '1', '0.1', '1', '10', '100', 'a'],
['0.02', '3', '0.2', '2', '20', '200', 'b'],
['0.03', '2', '0.3', '3', '30', '300', 'c'],
['0.04', '1', '0.4', '4', '40', '400', 'd']], dtype='<U4')
In [89]: A[:,4]
Out[89]: array(['10', '20', '30', '40'], dtype='<U4')
genfromtxt
, по умолчанию пытается сделать поплавки. Но в этом случае символьный столбец будет nan
. Вместо этого я указал str
dtype.
Таким образом, числовой тест потребует преобразования столбца в числа:
In [90]: A[:,4].astype(int)
Out[90]: array([10, 20, 30, 40])
In [91]: A[:,4].astype(int)<30
Out[91]: array([ True, True, False, False])
В этом случае также работает сравнение строк:
In [99]: A[:,4]<'30'
Out[99]: array([ True, True, False, False])
Или, если мы используем dtype = None, он выводит dtype по столбцу и создает структурированный массив:
In [93]: A1 = np.genfromtxt(txt.splitlines(), dtype=None,encoding=None)
In [94]: A1
Out[94]:
array([(0.01, 1, 0.1, 1, 10, 100, 'a'), (0.02, 3, 0.2, 2, 20, 200, 'b'),
(0.03, 2, 0.3, 3, 30, 300, 'c'), (0.04, 1, 0.4, 4, 40, 400, 'd')],
dtype=[('f0', '<f8'), ('f1', '<i8'), ('f2', '<f8'), ('f3', '<i8'), ('f4', '<i8'), ('f5', '<i8'), ('f6', '<U1')])
Теперь мы можем выбрать поле по имени и проверить его:
In [95]: A1['f4']
Out[95]: array([10, 20, 30, 40])
В любом случае мы можем выбирать строки на основе маски True / False или соответствующих индексов строк:
In [96]: A[[0,1],:]
Out[96]:
array([['0.01', '1', '0.1', '1', '10', '100', 'a'],
['0.02', '3', '0.2', '2', '20', '200', 'b']], dtype='<U4')
In [98]: A1[[0,1]] # A1 is 1d
Out[98]:
array([(0.01, 1, 0.1, 1, 10, 100, 'a'), (0.02, 3, 0.2, 2, 20, 200, 'b')],
dtype=[('f0', '<f8'), ('f1', '<i8'), ('f2', '<f8'), ('f3', '<i8'), ('f4', '<i8'), ('f5', '<i8'), ('f6', '<U1')])