我有一个数据集,其中包含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)的numpy矩阵,但是实际形状为(1,32562),里面有很多list([一行数据]):>
这怎么可能发生? numpy在将带有字符串的列表更改为矩阵时是否有问题?
答案 0 :(得分:0)
如果行中的列数不同,则会发生这种情况,因为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)