In [401]: txt="""9 10 5
...: 8 9 10 5 12 15
...: 7 3 5
...: 9 10 5
...: 8 9 10 5 12 15
...: 7 3 5
...: 9 10 5
...: 8 9 10 5 12 15
...: 7 3 5""".splitlines()
(это приблизительно соответствует тому, что мы получили бы с readlines
)
Сбор списка списков является простым, но преобразование строк в числа потребовало бы понимания списка:
In [402]: alist = []
In [403]: for line in txt:
...: alist.append(line.split())
...:
In [404]: alist
Out[404]:
[['9', '10', '5'],
['8', '9', '10', '5', '12', '15'],
['7', '3', '5'],
['9', '10', '5'],
['8', '9', '10', '5', '12', '15'],
['7', '3', '5'],
['9', '10', '5'],
['8', '9', '10', '5', '12', '15'],
['7', '3', '5']]
In [405]: np.array(alist)
Out[405]:
array([list(['9', '10', '5']), list(['8', '9', '10', '5', '12', '15']),
list(['7', '3', '5']), list(['9', '10', '5']),
list(['8', '9', '10', '5', '12', '15']), list(['7', '3', '5']),
list(['9', '10', '5']), list(['8', '9', '10', '5', '12', '15']),
list(['7', '3', '5'])], dtype=object)
Может быть быстрее преобразовать каждую строку в массив целых чисел (но это всего лишь предположение):
In [406]: alist = []
...: for line in txt:
...: alist.append(np.array(line.split(), dtype=int))
...:
...:
In [407]: alist
Out[407]:
[array([ 9, 10, 5]),
array([ 8, 9, 10, 5, 12, 15]),
array([7, 3, 5]),
array([ 9, 10, 5]),
array([ 8, 9, 10, 5, 12, 15]),
array([7, 3, 5]),
array([ 9, 10, 5]),
array([ 8, 9, 10, 5, 12, 15]),
array([7, 3, 5])]
In [408]: np.array(alist)
Out[408]:
array([array([ 9, 10, 5]), array([ 8, 9, 10, 5, 12, 15]),
array([7, 3, 5]), array([ 9, 10, 5]),
array([ 8, 9, 10, 5, 12, 15]), array([7, 3, 5]),
array([ 9, 10, 5]), array([ 8, 9, 10, 5, 12, 15]),
array([7, 3, 5])], dtype=object)
Учитывая неправильный характер текста и смешивание длин массивов в результате, альтернативы не так много. Массивы или списки различного размера - довольно хороший показатель того, что быстрые операции с многомерными массивами невозможны.
Мы можем загрузить все числа в виде 1d-массива с помощью:
In [413]: np.fromstring(' '.join(txt), sep=' ', dtype=int)
Out[413]:
array([ 9, 10, 5, 8, 9, 10, 5, 12, 15, 7, 3, 5, 9, 10, 5, 8, 9,
10, 5, 12, 15, 7, 3, 5, 9, 10, 5, 8, 9, 10, 5, 12, 15, 7,
3, 5])
, но разбив его на строковые массивы все еще требуют некоторого количества строк с последующим разделением массива. Поэтому я сомневаюсь, что это сэкономит время.