首页 文章

如何在NumPy中将CSV数据读入记录数组?

提问于
浏览
310

我想知道是否有直接的方法将CSV文件的内容导入记录数组,就像R的 read.table()read.delim()read.csv() 系列将数据导入R的数据框一样?

或者是使用csv.reader()然后应用类似 numpy.core.records.fromrecords() 的最佳方式?

10 回答

  • 134

    您可以使用此代码将CSV文件数据发送到数组中:

    import numpy as np
    csv = np.genfromtxt('test.csv', delimiter=",")
    print(csv)
    
  • 1

    使用numpy.loadtxt

    一个非常简单的方法 . 但它需要所有元素都是float(int等)

    import numpy as np 
    data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)
    
  • 481

    我建议使用表格( pip3 install tables ) . 您可以使用pandas( pip3 install pandas )将 .csv 文件保存到 .h5

    import pandas as pd
    data = pd.read_csv("dataset.csv")
    store = pd.HDFStore('dataset.h5')
    store['mydata'] = data
    store.close()
    

    然后,您可以轻松地,即使对于大量数据,也可以用更少的时间将数据加载到NumPy阵列中 .

    import pandas as pd
    store = pd.HDFStore('dataset.h5')
    data = store['mydata']
    store.close()
    
    # Data in NumPy format
    data = data.values
    
  • 0

    我会推荐 pandas 库中的read_csv函数:

    import pandas as pd
    df=pd.read_csv('myfile.csv', sep=',',header=None)
    df.values
    array([[ 1. ,  2. ,  3. ],
           [ 4. ,  5.5,  6. ]])
    

    这给了一只大熊猫DataFrame - 允许many useful data manipulation functions which are not directly available with numpy record arrays .

    DataFrame是一个二维标记数据结构,其中包含可能不同类型的列 . 你可以把它想象成电子表格或SQL表......


    我也建议 genfromtxt . 但是,由于问题要求record array,而不是普通数组,因此需要将 dtype=None 参数添加到 genfromtxt 调用中:

    给定输入文件, myfile.csv

    1.0, 2, 3
    4, 5.5, 6
    
    import numpy as np
    np.genfromtxt('myfile.csv',delimiter=',')
    

    给出一个数组:

    array([[ 1. ,  2. ,  3. ],
           [ 4. ,  5.5,  6. ]])
    

    np.genfromtxt('myfile.csv',delimiter=',',dtype=None)
    

    给出一个记录数组:

    array([(1.0, 2.0, 3), (4.0, 5.5, 6)], 
          dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')])
    

    这具有multiple data types (including strings) can be easily imported文件的优点 .

  • 56

    这是最简单的方法:

    import csv with open('testfile.csv', newline='') as csvfile: data = list(csv.reader(csvfile))

    现在,数据中的每个条目都是一个记录,表示为数组 . 所以你有一个2D数组 . 它为我节省了很多时间 .

  • 10

    我定时了

    from numpy import genfromtxt
    genfromtxt(fname = dest_file, dtype = (<whatever options>))
    

    import csv
    import numpy as np
    with open(dest_file,'r') as dest_f:
        data_iter = csv.reader(dest_f,
                               delimiter = delimiter,
                               quotechar = '"')
        data = [data for data in data_iter]
    data_array = np.asarray(data, dtype = <whatever options>)
    

    在460万行,大约70列,发现NumPy路径需要2分16秒,而csv-list理解方法需要13秒 .

    我建议使用csv-list理解方法,因为它很可能依赖于预编译的库而不是NumPy那样的解释器 . 我怀疑pandas方法会有类似的解释器开销 .

  • 5

    您也可以尝试 recfromcsv() ,它可以猜测数据类型并返回格式正确的记录数组 .

  • 0

    我试过这个:

    import pandas as p
    import numpy as n
    
    closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float)
    print(closingValue)
    
  • 64

    您可以使用Numpy的 genfromtxt() 方法,通过将 delimiter kwarg设置为逗号 .

    from numpy import genfromtxt
    my_data = genfromtxt('my_file.csv', delimiter=',')
    

    有关该功能的更多信息可在各自的documentation找到 .

  • 2

    当我尝试使用NumPy和Pandas时,使用pandas有很多优点:

    • 更快

    • 减少CPU使用率
      与NumPy genfromtxt相比,

    • 1/3 RAM使用率

    这是我的测试代码:

    $ for f in test_pandas.py test_numpy_csv.py ; do  /usr/bin/time python $f; done
    2.94user 0.41system 0:03.05elapsed 109%CPU (0avgtext+0avgdata 502068maxresident)k
    0inputs+24outputs (0major+107147minor)pagefaults 0swaps
    
    23.29user 0.72system 0:23.72elapsed 101%CPU (0avgtext+0avgdata 1680888maxresident)k
    0inputs+0outputs (0major+416145minor)pagefaults 0swaps
    

    test_numpy_csv.py

    from numpy import genfromtxt
    train = genfromtxt('/home/hvn/me/notebook/train.csv', delimiter=',')
    

    test_pandas.py

    from pandas import read_csv
    df = read_csv('/home/hvn/me/notebook/train.csv')
    

    数据文件:

    du -h ~/me/notebook/train.csv
     59M    /home/hvn/me/notebook/train.csv
    

    在版本中使用NumPy和pandas:

    $ pip freeze | egrep -i 'pandas|numpy'
    numpy==1.13.3
    pandas==0.20.2
    

相关问题