(Python)使用numpy.genfromtxt填充数据列表(不同的数据类型)

时间:2018-10-05 22:03:13

标签: python list numpy types genfromtxt

我有一个类似的data.txt

16.37.235.153|119.222.242.130|38673|161|17|62|4646|
16.37.235.153|119.222.242.112|56388|161|17|62|4646|
16.37.235.200|16.37.235.153|59009|514|17|143|21271|

我想获取以下形式的列表:

list=[['16.37.235.153','119.222.242.130',38673,161,17,62,4646]
      ['16.37.235.153','119.222.242.112',56388,161,17,62,4646]
      ['16.37.235.200','16.37.235.153',59009,514,17,143,21271]]

我尝试将numpy.genfromtxt与dtype = None一起使用,但随后我得到了:

VisibleDeprecationWarning: Reading unicode strings without specifying the encoding argument is deprecated. Set the encoding, use None for the system default.
  list = numpy.genfromtxt('results.rw', dtype=None, delimiter = '|')

这是列表:

[['8.254.200.14' 'False']
 ['8.254.200.14' 'False']
 ['8.254.200.46' 'False']
 ...
 ['217.243.224.144' 'False']
 ['217.243.224.144' 'False']
 ['217.243.224.144' 'False']]

感谢所有帮助,在此先感谢您。

问候:)

3 个答案:

答案 0 :(得分:1)

In [71]: txt = '''16.37.235.153|119.222.242.130|38673|161|17|62|4646|
    ...: 16.37.235.153|119.222.242.112|56388|161|17|62|4646|
    ...: 16.37.235.200|16.37.235.153|59009|514|17|143|21271|
    ...: '''

encoding警告是令人讨厌的,但不重要。

使用dtype = None,您应该获得一个结构化数组,每列一个field

In [74]: data = np.genfromtxt(txt.splitlines(), encoding=None, dtype=None,delimiter='|')
In [75]: data
Out[75]: 
array([('16.37.235.153', '119.222.242.130', 38673, 161, 17,  62,  4646, False),
       ('16.37.235.153', '119.222.242.112', 56388, 161, 17,  62,  4646, False),
       ('16.37.235.200', '16.37.235.153', 59009, 514, 17, 143, 21271, False)],
      dtype=[('f0', '<U13'), ('f1', '<U15'), ('f2', '<i8'), ('f3', '<i8'), ('f4', '<i8'), ('f5', '<i8'), ('f6', '<i8'), ('f7', '?')])

这是1d。

并作为列表(或元组)的列表

In [76]: data.tolist()
Out[76]: 
[('16.37.235.153', '119.222.242.130', 38673, 161, 17, 62, 4646, False),
 ('16.37.235.153', '119.222.242.112', 56388, 161, 17, 62, 4646, False),
 ('16.37.235.200', '16.37.235.153', 59009, 514, 17, 143, 21271, False)]

看起来它用布尔值|填充了最后一个字段(在最后一个False之后)。可以使用某些filling参数来更改。

或限制usecols省略

In [77]: data = np.genfromtxt(txt.splitlines(), encoding=None, dtype=None,delimiter='|',u
    ...: secols=range(7))
In [78]: data
Out[78]: 
array([('16.37.235.153', '119.222.242.130', 38673, 161, 17,  62,  4646),
       ('16.37.235.153', '119.222.242.112', 56388, 161, 17,  62,  4646),
       ('16.37.235.200', '16.37.235.153', 59009, 514, 17, 143, 21271)],
      dtype=[('f0', '<U13'), ('f1', '<U15'), ('f2', '<i8'), ('f3', '<i8'), ('f4', '<i8'), ('f5', '<i8'), ('f6', '<i8')])

答案 1 :(得分:0)

使用类似的东西可能会更近

+/

但是您似乎要混合使用字符串和整数,所以也许您应该使用两个数组

编辑w.r.t.您的其他问题(无关的问题):

获取numpy数组中某项的出现频率的一种方法是对由where或equal测试得出的布尔数组求和。即

@:

答案 2 :(得分:-1)

谢谢你们,我已经解决了。我在genfromtxt中使用了错误的文件。.我使用的文件只有1列...

其他问题:有人可以告诉我如何计算一个numpy ndarray中值的出现。