Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在将列表分配给numpy数组之前,使用列表读取数据是否有效?_Python_Arrays_Performance_Csv_Numpy - Fatal编程技术网

Python 在将列表分配给numpy数组之前,使用列表读取数据是否有效?

Python 在将列表分配给numpy数组之前,使用列表读取数据是否有效?,python,arrays,performance,csv,numpy,Python,Arrays,Performance,Csv,Numpy,我有一个大的CSV数据文件--1444000行数据--我正在读取并转换成numpy数组。我读了22个专栏中的三个。这就是我目前正在做的: import numpy as np import csv fid = open('data.csv', 'r') csvfile = csv.reader(fid, dialect='excel', delimiter=',') csvfile.next() # to skip header t = [] u = [] w = [] for line i

我有一个大的CSV数据文件--1444000行数据--我正在读取并转换成numpy数组。我读了22个专栏中的三个。这就是我目前正在做的:

import numpy as np
import csv

fid = open('data.csv', 'r')
csvfile = csv.reader(fid, dialect='excel', delimiter=',')
csvfile.next() # to skip header

t = []
u = []
w = []
for line in csvfile:
  t += [line[1]] # time
  u += [line[-4]] # velocity x
  w += [line[-2]] # velocity z
t = np.array(t, dtype='float')  
u = np.array(u, dtype='float')
w = np.array(w, dtype='float')
所以我的问题是:这有效率吗?我本来打算将新数据附加到循环中现有的numpy数组中,直到读到每次在内存中移动整个数组为止。

我建议这样做。我还没有将它用于csv,但您可以将分隔符设置为“”,并仅检索作为numpy ndarray所需的列

我怀疑以下方法会奏效:

# To load only columns 1 (time), 19 (velocity x), and 21 (velocity z).
numpy.loadtxt('data.csv', delimiter=',', usecols=(1,19,21))

有一种简单的方法可以找出哪个更有效——编写两个实现(普通列表和numpy)并对它们进行分析:

如果您使用的是*nix操作系统,还可以进行更简单的测量:将每个版本的脚本作为
$time python script.py
运行

作为旁注,而不是这个

t+=[行[1]#时间

用这个


t.append(第[1]行)#time

不要过多地插入我自己的答案,但看看这个问题:对于将大文本文件读入numpy数组的不同方式的一些内存和执行时间分析。简言之,如果您真的担心效率,
numpy.fromiter
通常非常有用。您最初的解决方案(附加到numpy阵列)将绝对较慢。在整个列表中,这将是一个二次时间操作。Python数组允许常量时间追加,这将导致整个列表中的线性时间操作。为了解释为什么
.append
优于
+=
:当您执行
+=
,这就像说
t=t+[line[1]
,所以它构造了中间数组
t+[line[1]
,这包括复制所有的
t
,然后扔掉原来的
t
.append
,相反,如果原始
t
后面没有足够的空间来添加
行[1]
,则只需复制整个列表。感谢larsbutler的提示和@Dougal的解释。事实上,这不是真的。对于列表,
t+=[x]
只是在下面变成
t.extend([x])
。但是,没有理由只使用
t.append(x)
来构造列表
[x]
。这会更快,但会占用更多内存。1444000行*22列*8字节/双精度浮点~=240兆字节。在作为问题的一部分给出的代码中,内存使用量减少了大约三倍。好的一点,我没有考虑到这一点。但是,如果我读得正确,则显示每个列都是临时加载的,但是指定
usecols
只会将所需的列添加到返回数组中。如果是这样的话,那么额外的内存是最小的(只有19列*8字节),并且每行可以循环使用。这比Python所能提供的任何东西都要好——特别是如果这些是浮点,而不是双精度,因为纯Python只支持双精度。