numpy.matrix

时间:2019-09-24 04:35:31

标签: python python-3.x numpy

我有一个数据集,其中包含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([一行数据]):

enter image description here

这怎么可能发生? numpy在将带有字符串的列表更改为矩阵时是否有问题?

1 个答案:

答案 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)])

或使用genfromtxtloadtxtpandas.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)