Чтение текстового файла с несколькими блоками, разделенными знаком # - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть текстовый файл с несколькими блоками, разделенными #. Количество строк в каждом блоке разное. Я бы интегрировал переменную для каждого блока. Текстовый файл выглядит следующим образом:

# a    b    c
### grid 1
  1    2    3
  2    3    4
  3    4    5
### grid 2
  11   12   13
  12   13   14
  13   14   15
### grid 3
  21   22   23
  22   23   24
  23   24   25
  24   25   26

Я собираюсь интегрировать a*c для каждого блока. Используя первый блок в качестве примера, результат должен быть 1*3 + 2*4 + 3*5. Любые идеи для его реализации, используя numpy или pandas?

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Я нашел ответ от @Fred Foo, который хорошо читает файл.

from itertools import groupby

def contains_data(ln):
    # just an example; there are smarter ways to do this
    return ln[0] not in "#\n"

with open("example") as f:
    datasets = [[ln.split() for ln in group] \
            for has_data, group in groupby(f, contains_data) \
            if has_data]

dim1 = len(datasets)

cooling_intgrl = np.zeros(dim1)
for i in range(dim1):
    block = np.array(datasets[i]).astype(float)
    length = block[:,0]
    cooling = block[:,2]
    result = np.dot(length, cooling)
    cooling_intgrl[i] = result

Это очень хорошо работает для меня.

0 голосов
/ 20 апреля 2020

Как только вы загрузите блок в память, вы получите массив, подобный:

In [115]: arr = np.arange(1,4)+np.arange(0,3)[:,None]                                                  
In [116]: arr                                                                                          
Out[116]: 
array([[1, 2, 3],
       [2, 3, 4],
       [3, 4, 5]])

, тогда сумма продуктов становится простой:

In [117]: np.dot(arr[:,0], arr[:,2])                                                                   
Out[117]: 26
In [118]: 1*3+2*4+3*5                                                                                  
Out[118]: 26
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...