Как прочитать текстовый файл, содержащий numpy.ndarray в python

#python #text-files #numpy-ndarray

#python #текстовые файлы #numpy-ndarray

Вопрос:

Интересно, какой правильный синтаксис для чтения следующего test.txt файла, который содержит следующие значения:

(p.s. test.txt имеет тип numpy.ndarray)

 [0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
 0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
 0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
 0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
 0.    0.    0.    0.    0.    0.    0.    0.    0.    0.51  0.47  0.45
 0.42  0.42  0.4   0.385 0.375 0.41  0.415 0.375 0.355 0.36  0.41  0.4
 0.39  0.38  0.375 0.375 0.375 0.38  0.39  0.395 0.385 0.38  0.375 0.375
 0.37  0.365 0.36  0.355 0.35  0.35  0.345 0.345 0.35  0.36  0.355 0.355
 0.35  0.35  0.355 0.355 0.35  0.35  0.35  0.345 0.34  0.335 0.325 0.325
 0.325 0.33  0.345 0.325 0.32  0.315 0.315 0.315 0.31  0.31  0.31  0.305
 0.305 0.3   0.3   0.29  0.29  0.3   0.295 0.29  0.29  0.29  0.29  0.29]
  

Я попытался прочитать файл, используя следующий код:

 data_test = np.genfromtxt('test.txt')
  

Но я получаю сообщение об ошибке:

 ValueError: Some errors were detected !
    Line #43 (got 8 columns instead of 12)
  

Любая помощь в чтении такого рода данных, разделенных пробелом / столбцами, была бы очень признательна!

Комментарии:

1. Я думаю, что реальный ответ — исправить то, что его написало! Это должен быть 1-мерный массив или 2?

2. @tdelaney это должен быть одномерный массив!

Ответ №1:

используйте numpy.fromstring

 with open('test.txt') as file:
    data = file.read()
data = data.replace('n', '')
arr = np.fromstring(data[1:-1], sep=' ', dtype=np.float32)
  

Ответ №2:

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

 >>> import numpy as np
>>> import re
>>> with open('foo.txt') as fileobj:
...     arr = np.array([float(val) for val in re.findall(r"[d.] ",
...             fileobj.read(), flags=re.MULTILINE)])
... 
>>> arr
array([0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   ,
       0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   ,
       0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   ,
       0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   ,
       0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   ,
       0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   ,
       0.   , 0.   , 0.   , 0.51 , 0.47 , 0.45 , 0.42 , 0.42 , 0.4  ,
       0.385, 0.375, 0.41 , 0.415, 0.375, 0.355, 0.36 , 0.41 , 0.4  ,
       0.39 , 0.38 , 0.375, 0.375, 0.375, 0.38 , 0.39 , 0.395, 0.385,
       0.38 , 0.375, 0.375, 0.37 , 0.365, 0.36 , 0.355, 0.35 , 0.35 ,
       0.345, 0.345, 0.35 , 0.36 , 0.355, 0.355, 0.35 , 0.35 , 0.355,
       0.355, 0.35 , 0.35 , 0.35 , 0.345, 0.34 , 0.335, 0.325, 0.325,
       0.325, 0.33 , 0.345, 0.325, 0.32 , 0.315, 0.315, 0.315, 0.31 ,
       0.31 , 0.31 , 0.305, 0.305, 0.3  , 0.3  , 0.29 , 0.29 , 0.3  ,
       0.295, 0.29 , 0.29 , 0.29 , 0.29 , 0.29 ])