1

我有一个 dtype = object 的 numpy 数组(实际上是各种数据类型的列表)。所以它创建了一个二维数组,因为我有一个列表数组(?)。我想将此数组的每一行和仅某些列复制到另一个数组。我将数据从 csv 文件存储在这个数组中。此 csv 文件包含多个字段(列)和大量行。这是我用来将数据存储到数组中的代码块。

data = np.zeros((401125,), dtype = object)
for i, row in enumerate(csv_file_object):
    data[i] = row

数据基本上可以描述如下

column1  column2  column3  column4  column5 ....
1         none     2       'gona'    5.3
2         34       2       'gina'    5.5
3         none     2       'gana'    5.1
4         43       2       'gena'    5.0
5         none     2       'guna'    5.7
.....     ....   .....      .....    ....
.....     ....   .....      .....    ....
.....     ....   .....      .....    ....

中间有我想要删除的不需要的字段。假设我不想要第 3 列。如何从我的数组中仅删除该列?或者仅将相关列复制到另一个数组?

4

3 回答 3

4

使用熊猫。在我看来,对于您的各种类型的数据,pandas.DataFrame可能更合适。

from StringIO import StringIO
from pandas import *
import numpy as np

data = """column1  column2  column3  column4  column5
1         none     2       'gona'    5.3
2         34       2       'gina'    5.5
3         none     2       'gana'    5.1
4         43       2       'gena'    5.0
5         none     2       'guna'    5.7"""

data = StringIO(data)
print read_csv(data, delim_whitespace=True).drop('column3',axis =1)

出去:

   column1 column2 column4  column5
0        1    none  'gona'      5.3
1        2      34  'gina'      5.5
2        3    none  'gana'      5.1
3        4      43  'gena'      5.0
4        5    none  'guna'      5.7

如果您需要一个数组而不是 DataFrame,请使用以下to_records()方法:

df.to_records(index = False)
#output:
rec.array([(1L, 'none', "'gona'", 5.3),
           (2L, '34', "'gina'", 5.5),
           (3L, 'none', "'gana'", 5.1),
           (4L, '43', "'gena'", 5.0),
           (5L, 'none', "'guna'", 5.7)], 
            dtype=[('column1', '<i8'), ('column2', '|O4'),
                   ('column4', '|O4'), ('column5', '<f8')])
于 2013-01-28T09:17:28.663 回答
3

假设您正在读取 CSV 行并将它们粘贴到一个numpy数组中,最简单和最好的解决方案几乎肯定是在数据到达数组之前对其进行预处理,正如 Maciek D. 的回答所示。(如果你想做一些比“删除第 3 列”更复杂的事情,你可能想要类似的东西[value for i, value in enumerate(row) if i not in (1, 3, 5)],但想法仍然是一样的。)

但是,如果您已经导入了数组并且想要在事后过滤它,您可能想要takeor delete

>>> d=np.array([[1,None,2,'gona',5.3],[2,34,2,'gina',5.5],[3,None,2,'gana',5.1],[4,43,2,'gena',5.0],[5,None,2,'guna',5.7]])
>>> np.delete(d, 2, 1)
array([[1, None, gona, 5.3],
       [2, 34, gina, 5.5],
       [3, None, gana, 5.1],
       [4, 43, gena, 5.0],
       [5, None, guna, 5.7]], dtype=object)
>>> np.take(d, [0, 1, 3, 4], 1)
array([[1, None, gona, 5.3],
       [2, 34, gina, 5.5],
       [3, None, gana, 5.1],
       [4, 43, gena, 5.0],
       [5, None, guna, 5.7]], dtype=object)

对于“删除第3列”的简单情况,delete更有意义;对于更复杂的情况,take可能更有意义。

如果您还没有弄清楚如何首先导入数据,您可以使用内置csv模块和 Maciek D. 之类的代码和过程,或者使用类似pandas.read_csv和后处理的东西结果,如根的答案所示。

但首先使用本机numpy数据格式而不是 CSV 可能会更好。

于 2013-01-28T09:18:39.170 回答
1

您可以使用范围选择。例如。要删除 column3,您可以使用:

data = np.zeros((401125,), dtype = object)
for i, row in enumerate(csv_file_object):
    data[i] = row[:2] + row[3:]

假设 csv_file_object 产生列表,这将起作用。如果它是一个使用 创建的简单file对象,请在循环csv_file_object = open("file.cvs")中添加:split

data = np.zeros((401125,), dtype = object)
for i, row in enumerate(csv_file_object):
    row = row.split()
    data[i] = row[:2] + row[3:]
于 2013-01-28T08:56:02.950 回答