我是python的新手,我试图使用genfromtext()函数 我正在从csv文件中读取数据,将其转换为numpy中的数组并从我想要使用的数组中读取特定列。该阵列有一排我不需要的标题。数组中的一列是一串字符,其余是整数。我想isloate字符串和一列整数。这是我到目前为止所尝试的内容。
import csv
import os
import numpy as np
import matplotlib.pyplot as plt
csv_to_array2 = np.genfromtxt('test.csv',
delimiter = ',' , dtype = "S5, S5, S5, S5, S5, S5" )
numrows2 = len(csv_to_array2)
numcols2 = len((csv_to_array2).T)
print(numrows2)
print(numcols2)
head_and_data2 = np.vsplit(csv_to_array2, np.array([1]) )
data2 = head_and_data2[1]
data_split2 = np.hsplit(data2, np.array([1,2]))
print(data2)
col_title= data_split2[0]
y = data_split2[1]
print(col_title)
我的测试文件如下
,n1,n2,n3,n4,n5
p1,1,2,3,4,5
p2,6,7,8,9,10
p3,11,12,13,14,15
p4,16,18,18,19,20
p5,21,22,23,24,25
当我运行程序时,输出如下
[(b'', b'n1', b'n2', b'n3', b'n4', b'n5')
(b'p1', b'1', b'2', b'3', b'4', b'5')
(b'p2', b'6', b'7', b'8', b'9', b'10')
(b'p3', b'11', b'12', b'13', b'14', b'15')
(b'p4', b'16', b'18', b'18', b'19', b'20')
(b'p5', b'21', b'22', b'23', b'24', b'25')]
追踪(最近一次呼叫最后一次):
File "/home/shubha/workspace/Raj_Data/Test_part.py", line 24, in <module>
head_and_data2 = np.vsplit(csv_to_array2, np.array([1]) )
File "/usr/lib/python3/dist-packages/numpy/lib/shape_base.py", line 590, in vsplit
raise ValueError('vsplit only works on arrays of 2 or more dimensions')
ValueError: vsplit only works on arrays of 2 or more dimensions
当我更改dtype= None
时,我会获得正确的列,但使用&#39; b&#39;在每个条目之前附加。因此,对于第二列第一行(在删除标题之后),我得到b&#39; 1&#39;当我删除dtype时,它给我一个错误,它无法读取第一列,每个条目都是&#39; nan&#39;
我很感激你能给我的任何帮助。谢谢。
答案 0 :(得分:0)
当genfromtxt
的输出感到困惑时,要做的第一件事就是打印数组的shape
和dtype
。
b'1'
是显示字节字符串的Python3方式。像这样的文件被读作字节。
我可以使用字节文本文件模拟您的数据文件。我在Python3中工作,其中字符串是unicode。字节字符串标有b
。我还添加了一个n0
。
In [78]: txt=b""" n0,n1,n2,n3,n4,n5
p1,1,2,3,4,5
p2,6,7,8,9,10
p3,11,12,13,14,15
p4,16,18,18,19,20
p5,21,22,23,24,25
"""
加载genfromtxt
; names=True
从1st
行获取字段名称; dtype=None
让它确定最佳字段类型:
In [79]: arr=np.genfromtxt(txt.splitlines(), names=True, delimiter=',', dtype=None)
In [80]: arr
Out[80]:
array([(b'p1', 1, 2, 3, 4, 5), (b'p2', 6, 7, 8, 9, 10),
(b'p3', 11, 12, 13, 14, 15), (b'p4', 16, 18, 18, 19, 20),
(b'p5', 21, 22, 23, 24, 25)],
dtype=[('n0', 'S2'), ('n1', '<i4'), ('n2', '<i4'), ('n3', '<i4'), ('n4', '<i4'), ('n5', '<i4')])
结果是一个5元素数组,有6个字段:
In [81]: arr.shape
Out[81]: (5,)
In [82]: arr.dtype
Out[82]: dtype([('n0', 'S2'), ('n1', '<i4'), ('n2', '<i4'), ('n3', '<i4'), ('n4', '<i4'), ('n5', '<i4')])
n0
字段是5个字节的字符串:
In [83]: arr['n0']
Out[83]:
array([b'p1', b'p2', b'p3', b'p4', b'p5'],
dtype='|S2')
“n2”字段是5个整数(“n1”等相同)
In [84]: arr['n2']
Out[84]: array([ 2, 7, 12, 18, 22])
In [85]:
不需要垂直或水平分割。
我可以使用astype
将第一个字段转换为unicode。
In [86]: arr['n0'].astype('U2')
Out[86]:
array(['p1', 'p2', 'p3', 'p4', 'p5'],
dtype='<U2')
列(字段)名称可以在dtype
:
In [87]: arr.dtype.names
Out[87]: ('n0', 'n1', 'n2', 'n3', 'n4', 'n5')
我也可以在原来的dtype
中进行unicode转换In [90]: dt='U2,i,i,i,i,i'
In [91]: arr=np.genfromtxt(txt.splitlines(), names=True, delimiter=',' ,dtype=dt)In [92]: arr
Out[92]:
array([('p1', 1, 2, 3, 4, 5), ('p2', 6, 7, 8, 9, 10),
('p3', 11, 12, 13, 14, 15), ('p4', 16, 18, 18, 19, 20),
('p5', 21, 22, 23, 24, 25)],
dtype=[('n0', '<U2'), ('n1', '<i4'), ('n2', '<i4'), ('n3', '<i4'), ('n4', '<i4'), ('n5', '<i4')])
In [93]: arr['n0']
Out[93]:
array(['p1', 'p2', 'p3', 'p4', 'p5'],
dtype='<U2')