Python 如何使用np.genfromtxt从csv文件直接强制转换numpy数组?
我正试图直接从csv文件生成numpy数组。我在网上了解到,您可以使用模块的np.genfromtxt函数来执行此操作。我尝试过这个,但我所有的价值观都是否定的。数据集来自kaggle关于纽约出租车的文章Python 如何使用np.genfromtxt从csv文件直接强制转换numpy数组?,python,arrays,numpy,csv,Python,Arrays,Numpy,Csv,我正试图直接从csv文件生成numpy数组。我在网上了解到,您可以使用模块的np.genfromtxt函数来执行此操作。我尝试过这个,但我所有的价值观都是否定的。数据集来自kaggle关于纽约出租车的文章 import numpy as np taxi = np.genfromtxt("nyc_taxis.csv", delimiter=";", skip_header=1) print(taxi) 输出为: 数组([nan,nan,nan,…,nan,nan,nan]) 我试图在这个项
import numpy as np
taxi = np.genfromtxt("nyc_taxis.csv", delimiter=";", skip_header=1)
print(taxi)
输出为:
数组([nan,nan,nan,…,nan,nan,nan])
我试图在这个项目中提高效率,使用尽可能少的代码行
我还尝试使用np.loadtxt()函数,但它返回了此错误
taxi = np.loadtxt("nyc_taxis.csv", delimiter=";", dtype =np.float, skiprows=1)
ValueError回溯(最近一次调用上次)
在里面
---->1 taxi=np.loadtxt(“nyc_taxis.csv”,delimiter=“;”,dtype=np.float,skiprows=1)
2.
3出租车
loadtxt中的~\anaconda3\lib\site packages\numpy\lib\npyio.py(fname、dtype、注释、分隔符、转换器、skiprows、usecols、unpack、ndmin、编码、最大行数)
1157#转换数据
1158 X=无
->1159用于读取数据中的x(\u loadtxt\u chunksize):
1160如果X为无:
1161 X=np.数组(X,数据类型)
读取数据中的~\anaconda3\lib\site packages\numpy\lib\npyio.py(块大小)
1085
1086#根据列转换每个值并存储
->1087项=[zip(转换器,val)中(conv,val)的conv(val)]
1088
1089#然后根据数据类型的嵌套进行打包
~\anaconda3\lib\site packages\numpy\lib\npyio.py in(.0)
1085
1086#根据列转换每个值并存储
->1087项=[zip(转换器,val)中(conv,val)的conv(val)]
1088
1089#然后根据数据类型的嵌套进行打包
floatconv(x)中的~\anaconda3\lib\site packages\numpy\lib\npyio.py
792如果x中的“0x”:
793返回浮动。从十六进制(x)
-->794回油浮子(x)
795
796 typ=dtype.type
ValueError:无法将字符串转换为浮点:“2016,1,1,5,0,2,4,21.002037,52.00,0.80,5.54,11.65,69.99,1”
非常感谢您的帮助。- 您必须设置分隔符=',',因为您的文件是逗号分隔的
- 您必须手动为字符串列设置dype,否则它将变为nan(仅加载指定其数据类型的列,因此我设置了所有列的数据类型)
import numpy as np
dtype=[
('id', 'S16'),
('vender_id', np.uint8),
('pickup_datetime', 'S16'),
('passenger_count', np.uint8),
('pickup_longitude', np.float32),
('pickup_latitude', np.float32),
('dropoff_longitude', np.float32),
('dropoff_latitude', np.float32),
('store_and_fwd_flag', 'S8'),
]
csv = np.genfromtxt('test.csv', delimiter=',', skip_header=1, dtype=dtype)
print(csv[:3])
,其中“S8”表示字符串8字节,输出
❯ python nyc.py
[(b'id3004672', 1, b'2016-06-30 23:59', 1, -73.98813, 40.73203 , -73.99017, 40.75668 , b'N')
(b'id3505355', 1, b'2016-06-30 23:59', 1, -73.9642 , 40.679993, -73.95981, 40.655403, b'N')
(b'id1217141', 1, b'2016-06-30 23:59', 1, -73.99744, 40.737583, -73.98616, 40.729523, b'N')]
另外,我推荐熊猫
错误消息中显示的示例显示逗号用作分隔符。为什么要使用分隔符=';'代码>?请尝试使用
delimiter=','
。如果您至少可以显示问题中输入文件的前几行,则会更容易得到他人的帮助。对于genfromtxt
而言,默认的dtype
是float
。如果csv元素不是有效的数字,它会将np.nan
放入该槽中。谢谢Naoki。我通知你详细的解释。非常感谢你抽出时间。我的一个问题是,是否必须手动填写元组的类型列表?如中所示,您是否先打开csv文件,然后将标题复制到列表中,并为每个标题指定所需的数据类型?是的,我必须签入其他电子表格软件。仅使用numpy似乎很难做到这一点(numpy主要用于处理数字数据)。使用dtype=None
和names=True
,genfromtxt
可以从文件中推断列名和数据类型。因此,我使用hpaulj建议的修改运行了代码,并尝试使用taxi.shape检查数组的形状,它返回了正确的行数,但在返回的元组“taxi.shape out”中没有显示任何列;(89560,)你知道为什么会发生这种事吗?
❯ python nyc.py
[(b'id3004672', 1, b'2016-06-30 23:59', 1, -73.98813, 40.73203 , -73.99017, 40.75668 , b'N')
(b'id3505355', 1, b'2016-06-30 23:59', 1, -73.9642 , 40.679993, -73.95981, 40.655403, b'N')
(b'id1217141', 1, b'2016-06-30 23:59', 1, -73.99744, 40.737583, -73.98616, 40.729523, b'N')]