更快的迭代CSV行的方法?

问题描述 投票:0回答:1

我有一个近28,000行x785列的CSV文件。我需要 1).将列分离出来。header,2)将每行的第一列放入一个 labels 将每行剩余的784列变成一个28x28的矩阵,并将它们追加到我的 images 数组的值转换为浮点数后。

有没有更快的方法来迭代我的CSV?

    images = np.array([])
    labels = np.array([])

    with open(filename) as training_file:
        reader = csv.reader(training_file, delimiter=',')
        header = np.array(next(reader))

        for row in reader:
            label = row[0] # get each row's label

            pixels = row[1:785] # get pixel values of each row
            pixels = np.array(pixels).astype(float) # transform pixel values to floats
            pixels = pixels.reshape(28,28) # turn into 28x28 matrix

            labels = np.append(labels, np.array(label)) # append to labels array
            images = np.append(images, np.array(pixels)) # append to images array

python numpy csv
1个回答
1
投票

你会使用 pandas 来读取你的csv文件。

import pandas as pd
csv_file = pd.read_csv('file.csv')

列的访问方式是 csv_file.name.

根据数据大小,你可以通过分块读取文件。

import pandas as pd
csv_file = pd.read_csv('file.csv', chunksize=1)

总之,读到的是 大熊猫文件 我认为这是最好的办法


1
投票

我认为创建数组的成本很高。对数组进行追加,会在后台重新创建数组,费用也很高。你可以一次分配所有的内存,比如。

x = np.empty((28000,784))

然后把每一行保存到数组的每一行中去 更新数组的速度极快,而且高度优化。当你完成后,你可以改变形状,x.shape = (28000,28,28)。请注意,在numpy中,数组形状和内存分配是断开的,因此重塑数组不需要任何代价(它只是更新了访问值的方式,并没有移动值)。这意味着没有理由在追加到数组之前重塑每一行。


0
投票

迭代几乎需要 没时间. 问题是你使用了一种非常低效的方法来创建数组。

千万不要在循环中使用 numpy.ndarray 对象:

labels = np.append(labels, np.array(label)) # append to labels array
images = np.append(images, np.array(pixels)) # append to images array

相反,应使 labelsimages 列表。

labels = []
images = []

然后在你的循环中, 追加到列表对象上(高效的操作):

labels.append(np.array(label)) # append to labels list
images.append(np.array(pixels)) # append to images list

最后,在你的循环完成后,将数组列表转换为数组。

labels = np.array(labels)
images = np.array(images)

注意,我不确定你期望的最终数组是什么形状的,你可能需要... ... reshape 的结果。您的方法会将最终的数组扁平化,每个数组的 .append因为你没有指定一个轴......如果这真的是你想要的,那么... ... labels.ravel() 终究会得到


0
投票

正如一些人所建议的那样。

  • 重新创建数组并不断地追加到数组中,计算成本很高。相反,我一开始就创建了空数组。这让本来就相对快速的计算变得更快。
    with open(filename) as training_file:
        reader = csv.reader(training_file, delimiter=',')
        header = np.array(next(reader)) # column headers

        row_count = len(list(reader))

        images = np.empty((row_count, 784)) # empty array
        labels = np.empty((row_count,)) # empty array

        for row in reader:
            labels.append(row[0]) # get each row's label
            images.append(row[1:785]) # get pixel values of each row

    labels = labels.astype(float)
    images = images.reshape(-1, 28,28).astype(float)
© www.soinside.com 2019 - 2024. All rights reserved.