Zhang, G. Ответов: 2

Как считывать данные и хранить их в 2D массиве с помощью numpy


Я хочу хранить данные разной длины из разных файлов в 2D-массиве.

файл данных:
data1.txt
1,2,3,4

data2.txt
1,2

data3.txt
1,2,65,7,8,9,0,5,4,8,3,43
....

Массив:
х=и NumPy.массив([])

x[number_of_File][данные]:
x[0]----выходные данные1
x[2]----выходные данные2
....

Что я уже пробовал:

Я могу использовать список для реализации этой функции следующим образом,
x = []
try:
    nameOfPath=["data1.txt","data2.txt","data3.txt",.....] # Names of pathFile can be defined in a document with .txt format
    for each_item in nameOfPath:
        with open(each_item, "r") as dataFile:
            x1 = []
            for each_line in dataFile:
                x1.append(each_line.split(","))
            x.extend(x1)    

except IOError as e:
    print(e)


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

Например:
Я использовал np.vstack
x = np.vstack([x, x1])


ошибка показывает, что
all the input array dimensions except for the concatenation axis must match exactly


размеры массива x и x1 не совпадают.

Итак, если я все еще хочу использовать numpy.array, как мне его реализовать?

Спасибо!

Электронная почта: gz.geophysics@outlook.com

Richard MacCutchan

Сообщение об ошибке ясно говорит вам, что вы не можете сделать это, если размеры отдельных массивов различны. Вы можете сначала создать несколько простых массивов с данными, а затем нормализовать их до длины самого длинного.

Zhang, G.

Фактически, список может выполнять эту функцию.
однако numpy.array имеет больше атрибутов и функций для использования. поэтому я все еще хочу использовать массив для хранения данных.

Richard MacCutchan

Хорошо, но вы все равно должны следовать правилам.

2 Ответов

Рейтинг:
9

Zhang, G.

Я нахожу решение для выполнения этой функции.

examples\data1

1   2   3

examples\data2

4   5   6   7   8   9   10

examples\data3

11  12

x = []
try:
    nameOfPath = ["examples\data1", "examples\data2",
                  "examples\data3"]  # Names of pathFile can be defined in a document with .txt format
    for each_item in nameOfPath:
        with open(each_item, "r") as dataFile:
            x1 = []
            for each_line in dataFile:
                x1.append(each_line.split(","))
            x.extend(x1)

except IOError as e:
    print(e)

import numpy as np

np_x = np.array(x)
print(len(np_x))
print(np_x)


выход:

3
[['1   2   3']
 ['4   5   6   7   8   9   10']
 ['11  12']]


Рейтинг:
13

VISWESWARAN1998

Я быстро просмотрел ваш код и заметил следующие вещи: вы читаете текстовый файл и разделяетесь с помощью", " я думаю, что вы должны использовать CSV файл вместо файла .txt, который будет легче обрабатывать.

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

Вот пример вашего файла,

DataFile:
data1.txt
1,2,3,4


Я преобразовал это в csv с именем данных.КШМ

Вот этот код:

import pandas as pd
import numpy as np

if __name__ == "__main__":
    data_frame = pd.read_csv("data.csv", header=None) # since you didn't specify header in your question
    np_array = data_frame.iloc[:, :].values # [:, :] => [rows, columns]
    print(np_array)  # print the numpy array
    print(np_array.ndim)  # print the dimension


который будет выводить это,

[[1 2 3 4]]
2  => dimension


Обратитесь еще сюда:
и NumPy.ndarray.ndim — библиотеки numpy версии v1.13 руководство по эксплуатации[^]

И еще одна вещь, у numpy есть метод под названием "reshape", который может изменить массив для нужных вам измерений.


Zhang, G.

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

еще пример:
данных.КШМ
1, 2, 3, 4, 5
1, 2, 4
2, 3, 5, 9, 10, 2, 3, 4, 7
1, 2
....

Я хочу использовать массив x[lineNum][data] для их хранения
len(x[0])=5
len(x[1])=3
len(x[2])=9
len(x[3])=2
....

в коде, мы обычно используем библиотеки numpy.vstack(х, пункт), чтобы добавить данные из каждой строки
к массиву.
но vstack требует, чтобы данные каждой строки были одинаковой длины,
он будет работать при условии, что len(x[0])=len(x[1])=len(x[2])=...=len(x[N])

Как использовать массив для выполнения этой функции?