Странный вывод из numpy.matrix - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть набор данных, который содержит 32562 строки и 15 столбцов, в каждой строке элементы каждого столбца разделены запятой ",".Я попытался прочитать его и сохранить все данные в матрице со следующим кодом:

import numpy as np

f = open("adult.data",'r')
data = []
for line in f.readlines():
    data.append(line.split(","))

print(data[0])
data = np.matrix(data)
print(data)

Я думаю, в конце концов, данные должны быть матовой матрицей с формой (32562,15), однако фактическая формаэто (1, 32562) с большим количеством списка ([строка данных]) внутри него:

enter image description here

Как это могло произойти?Есть ли у numpy проблемы с изменением списка со строкой внутри матрицы?

1 Ответ

0 голосов
/ 24 сентября 2019

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

# Example of irregular row length
mat = np.matrix([[1,2,3], [4,5]])
print(mat)   # matrix([[list([1, 2, 3]), list([4, 5])]], dtype=object)
print(mat.shape)   # (1L, 2L)

# Example of comma in text cell causing irregular row length
from StringIO import StringIO
f = StringIO('1, 2, "Some text"\n3, 4, "More, text"')
mat = np.matrix([line.split(",") for line in f])
print(mat)  # [[list(['1', ' 2', ' "Some text"\n'])  list(['3', ' 4', ' "More', ' text"'])]]
print(mat.shape)  # (1L, 2L)

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

import csv
f = StringIO('1, 2, "Some text"\n3, 4, "More, text"')
mat = np.matrix([row for row in csv.reader(f, skipinitialspace=True)])

или использоватьgenfromtxt, loadtxt или pandas.read_csv.

Но в вашем случае проблема заключается в дополнительной пустой строке вконец файла.

f = StringIO('6, 7\n8, 9\n\n')
print(np.matrix([line.split(",") for line in f])) # [[list(['6', ' 7\n']) list(['8', ' 9\n']) list(['\n'])]]

Это можно исправить, просто зачистив строки

f = StringIO('6, 7\n8, 9\n\n')
data=[]
for line in f:
    line = line.strip()
    if line:
        data.append(line.split(","))

mat = np.matrix(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...