Python читает текстовый файл в 2D-массив и получает доступ к данным - PullRequest
0 голосов
/ 19 декабря 2018

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

Вот выдержка из данных,

GRID     16             7.5     5.961539 0.
GRID     17             7.5     11.92308 0.
GRID     18             7.5     17.88461 0.
GRID     19             7.5     23.84615 0.
GRID     20             7.5     29.80769 0.
GRID     21             7.5     35.76923 0.
GRID     22             7.5     41.73077 0.
GRID     23             7.5     47.69231 0.
GRID     24             7.5     53.65384 0.

Используя приведенный здесь пример, Импортировать колоду узлов nastran в Python, используя numpy

Он импортирует ОК, но это как одномерный массив, и я, например, '1,1 []], получаю следующий ответ,

x[1,1]
Traceback (most recent call last):

  File "<ipython-input-85-3e593ebbc211>", line 1, in <module>
    x[1,1]

IndexError: too many indices for array

Я надеюсь, что

17

Я также попробовал следующий код, и снова это считывает в 1D массив,

ary = []

with open(os.path.join(dir, fn)) as fi:
    for line in fi:
        if line.startswith('GRID'):
            ary.append([line[i:i+8] for i in range(0, len(line), 8)])

, и я получаюследующая ошибка,

ary[1,2]
Traceback (most recent call last):

  File "<ipython-input-83-9ac21a0619e9>", line 1, in <module>
    ary[1,2]

TypeError: list indices must be integers or slices, not tuple

Я новичок в Python, но у меня есть опыт работы с VBA, где я много использовал массивы, но я пытаюсь понять, как загрузить массив и как получить доступ к конкретным данным,

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вы можете использовать функцию genfromtxt.

import numpy as np

ary = np.genfromtxt(file_name, dtype=None)

Это автоматически загрузит ваш файл и определит тип полей.Теперь вы можете получить доступ к ary по строке или столбцу, например,

In: ary['f1']
Out: array([16, 17, 18, 19, 20, 21, 22, 23, 24])

In: ary[2]
Out: (b'GRID', 18, 7.5, 17.88461, 0.)

или по одному элементу:

In: ary[3]['f1']
Out: 19

In: ary['f1'][3]
Out: 19
0 голосов
/ 19 декабря 2018

Вы импортируете его из текстового файла?Можете ли вы сохранить текстовый файл как CSV?Если это так, вы можете легко загрузить данные, используя pandas.

import pandas as pd

data = pd.read_csv(path_to_file)

Кроме того, возможно, вам просто нужно изменить форму массива с помощью чего-то вроде:

x = x.reshape(-1, 4)

РЕДАКТИРОВАТЬ: Поскольку ваш формат основан на фиксированной ширине, вы бы хотели использовать фиксированную ширину в пандах вместо read_csv.Пример ниже использует ширину 8.

x = pd.read_fwf(path_to_file, widths=8)
...