数组列表列表Python

时间:2016-05-30 06:06:18

标签: python csv pickle mnist

您好我遵循他们使用MNIST数据库的教程。现在,他们使用cPickle解压缩数据并获得列表元组,依此类推。我想使用我自己的数据,但我有csv格式,我不知道如何转换为MNIST格式。我使用48个单位作为训练数据,最后一个是我想要的结果

我如何拥有csv文件的示例:

1,2,3..........48,1

在我关注的教程中,他们使用了这个:

training_data, validation_data, test_data = cPickle.load(f)

如果我

print training_data

我明白了:

(array([[ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       ..., 
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.]], dtype=float32), array([5, 0, 4, ..., 8, 4, 8]))

print training_data [0]

[[ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 ..., 
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]]

print training_data [0] [0]是每个集合的值的numpy.array(),而training_data [1] [0]是和每个集合的欲望输出的float32。

我正在做的代码是这样的,但我对提示中显示的array()和dtype = float32感到困惑

def load(filename):
    finalDataset = []
    res = 0
    with open(filename, 'rb') as csvfile:
        lines = csv.reader(csvfile)
        datos = list(lines)
        for i in datos:
            tempA = np.array(i[:len(datos)-2]).astype(np.float64)
            tempB = np.float64(i[len(datos)-1:])
            finalDataset.append((tempA,tempB))
    return finalDataset

1 个答案:

答案 0 :(得分:2)

为了理解数据结构,您可以(最初)忽略array()和dtype信息。基本上你似乎需要一个两部分元组(让我们称它们为LEFT和RIGHT)。 LEFT是(矩形)列表列表(即2维数组),RIGHT是列表(即1维数组)。

对于csv中的每一行,您将前n-1个条目作为新行添加到LEFT,将最后一个条目添加到RIGHT。

关于你的负载功能: 您的代码将每行创建为单独的1dim数组+值,然后将它们作为元组添加到(python)列表中。这不是你想要的。如上所述,您需要一个保存数据的2dim数组和一个保持预期结果的1dim数组。

逐行扩展numpy数组有点棘手,在大多数情况下应该避免。然后,您可以选择将数据构建为(python)列表列表,然后将其整体转换为numpy数组,或者更好的是,创建一个预先调整大小的空numpy数组,然后用数据填充它。 / p>

我在下面使用的后一个概念:

def load(filename):
    # read file into a list of rows
    with open(filename, 'r') as csvfile:
        lines = csv.reader(csvfile, delimiter=';')
        rows = list(lines)

    # create empty numpy arrays of the required size
    data = np.empty((len(rows), len(rows[0])-1), dtype=np.float64)
    expected = np.empty((len(rows),), dtype=np.int64)

    # fill array with data from the csv-rows
    for i, row in enumerate(rows):
        data[i,:] = row[:-1]
        expected[i] = row[-1]

    training_data = data, expected
    return training_data

编辑: 请注意普通python列表和特别是numpy数组的非常简洁的索引功能。负指数从列表末尾开始计数,-1表示最后一个条目-2,倒数第二个,依此类推。 a:b索引切片,即索引为a,a + 1,... b-1的条目。如果a在该符号中留空,则表示"来自第一个"如果遗漏b,则意味着"到最后一个"条目。因此:表示"一切"。虽然普通的python列表在一个维度上支持这种语法,但是numpy数组通过用冒号分隔每个维度的索引来将其扩展为多维度。

EDIT2:空的numpy数组的大小稍微偏离。

EDIT3:回复你的评论:

type(training_data) = <type 'tuple'>表示training_data是一个元组(有两个元素)。

type(training_data[0]) = <type 'numpy.ndarray'>表示training_data[0]是一个numpy数组(为了简化理解,请将其视为等同于列表)。

type(training_data[1]) = <type 'numpy.ndarray'>表示training_data[1]也是一个numpy数组/列表。

type(training_data[0][0]) = <type 'numpy.ndarray'>表明training_data[0]的每个元素本身就是一个数组/列表。

type(training_data[1][0]) = <type 'numpy.int64'>表示training_data[1]的每个元素都是单个值。

使用len(training_data[0])len(training_data[1]),您可以看到training_data[0]中的每个条目(=这是一个值列表,即您的输入数据),{中有一个对应的条目{1}}(这是一个值,即您的预期结果值)。