(Python) Использование numpy.genfromtxt для заполнения списка данными (разные типы данных) - PullRequest
0 голосов
/ 06 октября 2018

у меня есть 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 голосов
/ 06 октября 2018

вы можете приблизиться, используя что-то вроде

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

, но вы, похоже, смешиваете строки и целые числа, поэтому, возможно, вам следует использовать два массива

EDIT по вашему дальнейшему (несвязанный вопрос):

Один из способов получить частоту элемента в массиве 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.
0 голосов
/ 06 октября 2018

Спасибо, ребята, я уже исправил это.Я использовал неправильный файл в genfromtxt .. мой файл, который я использовал, имел только 1 столбец ...

Другой вопрос: Может кто-нибудь сказать мне, как я могу подсчитать вхождение значения в numpy ndarray.

0 голосов
/ 06 октября 2018
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.

Или ограничить использование протокола для его пропуска

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