Чтение файла построчно и сохранение каждого в списке равносильно созданию списка строк:
In [98]: txt='''0 1.2 2 3.1
...: 20 21.2 22 23
...: 30 31 32 33.01'''.splitlines()
In [99]: txt
Out[99]: ['0 1.2 2 3.1', '20 21.2 22 23', '30 31 32 33.01']
Создание массива, из которого просто получается 1d массив строк.Это нельзя индексировать как двумерный числовой массив:
In [100]: np.array(txt)
Out[100]: array(['0 1.2 2 3.1', '20 21.2 22 23', '30 31 32 33.01'], dtype='<U14')
Если вы сначала разбиваете строки на подстроки:
In [101]: [line.split() for line in txt]
Out[101]:
[['0', '1.2', '2', '3.1'],
['20', '21.2', '22', '23'],
['30', '31', '32', '33.01']]
In [102]: np.array([line.split() for line in txt], dtype=float)
Out[102]:
array([[ 0. , 1.2 , 2. , 3.1 ],
[20. , 21.2 , 22. , 23. ],
[30. , 31. , 32. , 33.01]])
Это двумерный массив.
Мы можем выбрать столбец из этого массива.Но обратите внимание, что результатом является массив 1d:
In [104]: np.array([line.split() for line in txt], dtype=float)[:,1]
Out[104]: array([ 1.2, 21.2, 31. ])
Не беспокойтесь о том, что это «строка» или «столбец».Мы могли бы изменить форму на (1,3) или (3,1), но для большинства numpy
целей 1d форма (3,) также хороша.
numpy
имеет хорошее csv
loader (на самом деле два):
In [105]: np.genfromtxt(txt)
Out[105]:
array([[ 0. , 1.2 , 2. , 3.1 ],
[20. , 21.2 , 22. , 23. ],
[30. , 31. , 32. , 33.01]])
Обычно genfromtxt
присваивается имя файла, но он прекрасно работает с любыми строками, такими как список txt
.
И если вас интересует только один столбец, вы можете указать его с помощью usecols
(есть много других возможных параметров):
In [106]: np.genfromtxt(txt, usecols=1)
Out[106]: array([ 1.2, 21.2, 31. ])
genfromtxt
не самый быстрый загрузчик.Если вам нужна большая скорость, мы обычно рекомендуем загруженный pandas
.pandas
имеет более изящную обработку кавычек и пропущенных значений, но вам здесь это не нужно.numpy
пользователи, кажется, не очень часто используют модуль csv
;может быть, это просто не нужно.
Если вам действительно нужен column vector
, вот как использовать reshape
:
In [110]: col1 = np.genfromtxt(txt, usecols=1)
In [111]: col1
Out[111]: array([ 1.2, 21.2, 31. ])
In [112]: col1.reshape(3,1)
Out[112]:
array([[ 1.2],
[21.2],
[31. ]])
Давайтепостройте массив строка за строкой:
In [116]: data = []
In [117]: for line in txt:
...: arr = np.array(line.split(), dtype=float)
...: print(arr.shape)
...: data.append(arr)
...: print(data)
...:
...:
(4,)
[array([0. , 1.2, 2. , 3.1])]
(4,)
[array([0. , 1.2, 2. , 3.1]), array([20. , 21.2, 22. , 23. ])]
(4,)
[array([0. , 1.2, 2. , 3.1]), array([20. , 21.2, 22. , 23. ]), array([30. , 31. , 32. , 33.01])]
data
теперь является списком массивов:
In [118]: data
Out[118]:
[array([0. , 1.2, 2. , 3.1]),
array([20. , 21.2, 22. , 23. ]),
array([30. , 31. , 32. , 33.01])]
Объедините эти массивы в один массив:
In [119]: np.array(data)
Out[119]:
array([[ 0. , 1.2 , 2. , 3.1 ],
[20. , 21.2 , 22. , 23. ],
[30. , 31. , 32. , 33.01]])
(После этого проверьте форму. Если отдельные массивы отличаются по форме, результатом будет не 2d массив, а 1d массив, который ближе к исходному списку массивов.)