【问题标题】:(Python) Using numpy.genfromtxt for filling list with data (different datatypes)(Python) 使用 numpy.genfromtxt 用数据填充列表(不同的数据类型)
【发布时间】:2019-03-11 10:38:06
【问题描述】:

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

感谢每一个帮助,在此先感谢您。

你好 :)

【问题讨论】:

    标签: python list numpy types genfromtxt


    【解决方案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', '?')])
    

    这是 1 天。

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      编辑 w.r.t.你的进一步(不相关的问题):

      在 numpy 数组中获取项目频率的一种方法是将由 where 或相等测试产生的布尔数组求和。即

      a = np.random.randint(1, 10, (20000000,2))
      (a == 7).sum()
      => 4442874
      (a[:,0] == 7).sum()
      => 2220661
      (a[:,1] == 7).sum()
      => 2222213
      etc.
      

      【讨论】:

        【解决方案3】:

        谢谢大家,我已经修好了。我在 genfromtxt 中使用了错误的文件。我使用的文件只有 1 列...

        其他问题:谁能告诉我如何计算 numpy ndarray 中某个值的出现次数。

        【讨论】:

        • 嗨,添加其他问题有点令人困惑,但我已经添加到我的答案中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-29
        • 2021-02-13
        • 1970-01-01
        • 2017-05-07
        • 2011-02-02
        相关资源
        最近更新 更多