【发布时间】:2013-01-20 19:18:00
【问题描述】:
我有一个大型(300,000 行 x 25 列)数组,我在其中读取
dataset = numpy.genfromtxt(DataFileName,dtype="string",delimiter=',')
然后清理换行符和引号。我尝试了两种方式:
第一种清理方法
for i in range(len(dataset)):
for j in range(len(dataset[i])):
dataset[i][j] = dataset[i][j].replace("\n", "").replace("\"", "")
第二种清理方法
dataset = [ [word.replace('\n','').replace('"','') for word in dataset[i]] for i in range(len(dataset))]
在此之后,我对数组进行了一些密集搜索以计算一堆东西。如果我使用第二种方式而不是第一种方式进行清理,则搜索速度会快 5 倍。是什么原因?
【问题讨论】:
-
哇,确实很好奇。好吧,我看到的两个主要区别是,在第二种情况下,您使用和迭代器并将元素复制到新列表中,而不是就地更新。您是否尝试过在第二个中使用
[[word... for word in row] for row in dataset]而不是for i in ...? -
正如 Laurent 指出的那样,在一种情况下,您正在搜索一个 numpy 数组,在另一种情况下是一个列表。如果在第二种情况下,您将所有右侧包裹在
numpy.array(...)中,您应该得到与第一种情况完全相同的结果。根据您的经验,您不想这样做,因为对于您正在做的工作,列表似乎比数组更有效。此外,genfromtext允许您定义可以在读取数据时进行清理的converters函数,有关详细信息,请参阅文档:docs.scipy.org/doc/numpy/reference/generated/… -
如果您不向我们展示您的搜索方式,我们如何判断为什么在第二种情况下搜索速度更快? +1 詹姆。我现在正要写这个。我要指出,当您有 numerical 数据要处理时,numpy 是很好的。在大多数其他情况下,它只是比纯 python 解决方案慢(这通常还包括任意大整数运算)
-
数据元素(被搜索、处理等)目前都作为字符串进行操作——尽管它都是数字,所以可以想象在使用 genfromtext 读取数据时使用转换器来清理数据会有所帮助。
-
您能否提供几行数据,并概述您在清理后对它们运行的操作?
标签: python arrays numpy replace storage