将带有int和float列的csv文件中的文本加载到ndarray中

时间:2017-05-30 06:55:15

标签: arrays python-2.7 csv numpy

我有csv文件作为输入:

6,148,72,35,0,33.6,0.627,50,1
1,85,66,29,0,26.6,0.351,31,0
8,183,64,0,0,23.3,0.672,32,1
1,89,66,23,94,28.1,0.167,21,0

它有int和float的混合。 当我尝试使用“numpy.loadtext”导入文件时,我得到的是2d数组,每列都是浮点数。

r = np.loadtxt(open("text.csv", "rb"), delimiter=",", skiprows=0)

我收到输出,如:

array([[   6.   ,  148.   ,   72.   , ...,    0.627,   50.   ,    1.   ],
       [   1.   ,   85.   ,   66.   , ...,    0.351,   31.   ,    0.   ],
       [   8.   ,  183.   ,   64.   , ...,    0.672,   32.   ,    1.   ],
       ...,
       [   5.   ,  121.   ,   72.   , ...,    0.245,   30.   ,    0.   ],
       [   1.   ,  126.   ,   60.   , ...,    0.349,   47.   ,    1.   ],
       [   1.   ,   93.   ,   70.   , ...,    0.315,   23.   ,    0.   ]])

这是完美的2d数组,列表中的每一行而不是元组。 但是当查看数据类型时,每个列都被视为float,这是不正确的。

我要问的是有什么方法我可以输出如下:
期望的输出

array([[   6   ,  148   ,   72   , ...,    0.627,   50   ,    1   ],
       [   1   ,   85   ,   66   , ...,    0.351,   31   ,    0   ],
       [   8   ,  183   ,   64   , ...,    0.672,   32   ,    1   ],
       ...,
       [   5   ,  121   ,   72   , ...,    0.245,   30   ,    0   ],
       [   1   ,  126   ,   60   , ...,    0.349,   47   ,    1   ],
       [   1   ,   93   ,   70   , ...,    0.315,   23   ,    0   ]])

我确实尝试过这种方法:

r = np.loadtxt(open("F:/idm/compressed/ANN-CI1/Diabetes.csv", "rb"), delimiter=",", skiprows=0, dtype=[('f0',int),('f1',int),('f2',int),('f3',int),('f4',int),('f5',float),('f6',float),('f7',int),('f8',int)])

输出

array([( 6, 148,  72, 35,   0,  33.6,  0.627, 50, 1),
       ( 1,  85,  66, 29,   0,  26.6,  0.351, 31, 0),
       ( 8, 183,  64,  0,   0,  23.3,  0.672, 32, 1),
       ( 1,  89,  66, 23,  94,  28.1,  0.167, 21, 0),
       ...,
       ( 1, 126,  60,  0,   0,  30.1,  0.349, 47, 1),
       ( 1,  93,  70, 31,   0,  30.4,  0.315, 23, 0)],
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4'), ('f4','<i4'), ('f5', '<f8'), ('f6', '<f8'), ('f7', '<i4'), ('f8', '<i4')])

在这里你可以看到dtype解决问题,但现在它不是我需要的正确形式,
[[col1,col2,...,coln],]代替[(col1,col2,...,coln),] ndarray

由于
------------------ EDIT ------------------------
问题为什么我要问的是我将这个2d数组作为输入到我的二进制分类网络,当所有值都是int并且在[[]]形状时它会收敛到值,但在当前情况下它的混合输出是0或者1.具有非常高的错误学习。 访问https://github.com/naitikshukla/MachineLearning/blob/master/neural/demo_ann.py! 完整代码

在输入空间中,如果我标记当前输入并从第69-88行取消标记,则输出将为0和1。

所以我想将其更改为正确的数据类型,看看是否能解决我的问题。

下面有一个非常好的解释,这是不可能的,我会看到任何解决方法,看看我是否可以使用当前输入的火车和预测。

2 个答案:

答案 0 :(得分:1)

创建像[[col1,col2,...,coln],]这样包含不同类型值的numpy数组是不可能的。

numpy数组同质。换句话说,numpy数组只包含一种类型的值。

root->right

上面的这一行创建了一个浮动的2D数组,它的形状是4x9。

In [32]: sio = StringIO('''6,148,72,35,0,33.6,0.627,50,1
    ...: 1,85,66,29,0,26.6,0.351,31,0
    ...: 8,183,64,0,0,23.3,0.672,32,1
    ...: 1,89,66,23,94,28.1,0.167,21,0''')

In [33]: r = np.loadtxt(sio, delimiter=",", skiprows=0)
In [34]: r.shape
Out[34]: (4, 9)
In [41]: r.dtype
Out[41]: dtype('float64')

此行代码创建1-D structured array。此数组的每个元素都是包含9个项目的结构。它仍然是同质的。

答案 1 :(得分:0)

在第一种情况下,你得到一个2d浮点数组。在第二个,一个带有结构化dtype的1d数组,一个int和float的混合。第一列中的列现在命名为字段的位置。结构化记录标有()而不是[]。

这两种形式都是有效且有用的。这取决于你需要做什么。

当某些字段是字符串或其他不适合整数/浮点模式的字段时,结构化表单更有用。通常,您可以将整数作为浮点数使用而不会丢失任何功能。

第一种情况究竟出了什么问题,全部浮动?哪个是最重要的 - 命名列或列范围(例如0:5,5:8)?