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

2024-12-13 08:37:00
admin
原创
99
摘要:问题描述:是否有直接的方法将 CSV 文件的内容导入记录数组,就像 R 的read.table()、read.delim()和read.csv()将数据导入 R 数据框一样?或者我应该使用csv.reader()然后申请numpy.core.records.fromrecords()?解决方案 1:numpy...

问题描述:

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

或者我应该使用csv.reader()然后申请numpy.core.records.fromrecords()


解决方案 1:

numpy.genfromtxt()通过将delimiterkwarg 设置为逗号来使用:

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

解决方案 2:

使用pandas.read_csv

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

这为 pandasDataFrame提供了许多有用的数据操作函数,而这些函数无法通过 numpy 记录数组直接使用。

DataFrame是一个二维标记数据结构,其列可能具有不同类型的类型。您可以将其视为电子表格或 SQL 表...


我也会推荐numpy.genfromtxt。但是,由于问题要求记录数组,而不是普通数组,因此dtype=None需要在调用中添加参数genfromtxt

import numpy as np
np.genfromtxt('myfile.csv', delimiter=',')

对于以下内容'myfile.csv'

1.0, 2, 3
4, 5.5, 6

上面的代码给出了一个数组:

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')])

这样做的好处是可以轻松导入具有多种数据类型(包括字符串)的文件。

解决方案 3:

我试过了:

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 方法会有类似的解释器开销。

解决方案 4:

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

解决方案 5:

当我尝试使用 NumPy 和 Pandas 两种方法时,我发现使用 Pandas 有很多优点:

  • 快点

  • 更少的 CPU 使用率

  • 与 NumPy genfromtxt 相比,RAM 使用量为 1/3

这是我的测试代码:

$ 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

测试numpy_csv

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

测试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

解决方案 6:

使用numpy.loadtxt

一个相当简单的方法。但它要求所有元素都是浮点数(int 等)

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

解决方案 7:

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

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

解决方案 8:

这项工作很有魅力......

import csv
with open("data.csv", 'r') as f:
    data = list(csv.reader(f, delimiter=";"))

import numpy as np
data = np.array(data, dtype=np.float)

解决方案 9:

这是最简单的方法:

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

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

解决方案 10:

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

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

解决方案 11:

可在最新的 pandas 和 numpy 版本上使用。

import pandas as pd
import numpy as np

data = pd.read_csv('data.csv', header=None)

# Discover, visualize, and preprocess data using pandas if needed.

data = data.to_numpy()

解决方案 12:

我尝试过这个:

import pandas as p
import numpy as n

closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float)
print(closingValue)

解决方案 13:

In [329]: %time my_data = genfromtxt('one.csv', delimiter=',')
CPU times: user 19.8 s, sys: 4.58 s, total: 24.4 s
Wall time: 24.4 s

In [330]: %time df = pd.read_csv("one.csv", skiprows=20)
CPU times: user 1.06 s, sys: 312 ms, total: 1.38 s
Wall time: 1.38 s

解决方案 14:

这是一个非常简单的任务,最好的方法如下

import pandas as pd
import numpy as np


df = pd.read_csv(r'C:UsersRonDesktopClients.csv')   #read the file (put 'r' before the path string to address any special characters in the file such as ). Don't forget to put the file name at the end of the path + ".csv"

print(df)`

y = np.array(df)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1041  
  IPD(Integrated Product Development,集成产品开发)是一种系统化的产品开发方法论,旨在通过跨职能团队的协作,优化产品开发的效率和质量。IPD流程强调从市场需求出发,通过并行工程、跨部门协作和阶段性评审,确保产品从概念到上市的每个环节都高效且可控。随着敏捷开发方法的普及,越来越多的企业开始...
华为IPD流程   34  
  随着企业产品开发复杂度的提升以及市场需求的快速变化,传统的产品开发模式逐渐显现出局限性。集成产品开发(IPD)流程与敏捷开发(Agile Development)作为两种主流的开发方法论,分别从系统化管理和快速响应需求的角度为企业提供了解决方案。然而,单独使用其中一种方法往往无法完全满足企业在效率、质量和创新上的多重需...
华为IPD流程   31  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司成功的关键因素之一。它不仅帮助华为在技术上实现了快速创新,还通过市场导向确保了产品的商业成功。IPD流程通过整合技术与市场双驱动,实现了从需求定义到产品交付的全生命周期管理。这种模式不仅提高了产品的开发效率,还降低了市...
IPD流程中PDCP是什么意思   23  
  在研发领域,集成产品开发(IPD)流程已经成为企业提升创新效率和市场竞争力的重要手段。然而,资源分配的不合理往往是制约IPD流程效率的关键因素之一。无论是人力资源、财务资源还是技术资源,如何高效分配直接关系到项目的成功与否。优化资源分配不仅能够缩短产品开发周期,还能降低研发成本,提升产品的市场竞争力。因此,掌握资源分配...
IPD流程中CDCP   26  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用