Py学习  »  Python

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

QWERASDFYXCV • 4 年前 • 884 次点击  

我有一个这样的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]]

我试图在dtype=none的情况下使用numpy.genfromtxt,但是我得到:

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']]

谢谢你的帮助,提前谢谢你。

您好:)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39748
 
884 次点击  
文章 [ 3 ]  |  最新文章 4 年前
QWERASDFYXCV
Reply   •   1 楼
QWERASDFYXCV    5 年前

谢谢你们,我已经修好了。我在genfromtxt中使用了错误的文件。我使用的文件只有一列…

另一个问题:有人能告诉我如何计算numpy ndarray中某个值的出现次数吗?

paddyg
Reply   •   2 楼
paddyg    5 年前

你可能会更接近

a = np.genfromtxt('data.txt', dtype=['S16', 'S16', 'i8', 'i8', 'i8', 'i8','i8'], delimiter='|')

但是你好像是在混合字符串和整数,所以也许你应该使用两个数组

编辑W.R.T.你的进一步(无关的问题):

获取numpy数组中项的频率的一种方法是对where或equality测试产生的布尔数组求和。即

a = np.random.randint(1, 10, (20000000,2))
(a == 7).sum()
=> 4442874
(a[:,0] == 7).sum()
=> 2220661
(a[:,1] == 7).sum()
=> 2222213
etc.
hpaulj
Reply   •   3 楼
hpaulj    5 年前
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')])