Проблема преобразования списка питонов в np.array.Процесс отбрасывает данные типа sting - PullRequest
0 голосов
/ 17 октября 2018

Моя цель - преобразовать этот список строк в массив Numpy.

Я хочу преобразовать первые 2 столбца в числовые данные (целое число)

list1 = [['380850', '625105', 'Dota 2'],
      ['354804', '846193', "PLAYERUNKNOWN'S BATTLEGROUNDS"],
      ['204354', '467109', 'Counter-Strike: Global Offensive']
     ]

dt = np.dtype('i,i,U')
cast_array = np.array([tuple(row) for row in sl], dtype=dt)
print(cast_array)

В результате...

[OUT] [(380850, 625105, '') (354804, 846193, '') (204354, 467109, '')]

Я теряю строковые данные.Меня интересует

  1. Понимание того, почему отбрасываются строковые данные
  2. Поиск любого решения, которое преобразует первые 2 столбца в целочисленный тип в массиве numpy

Этот ответ дал мне подход, но, похоже, не работает для строк

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Самый простой способ сделать это на высоком уровне - это использовать панд, как сказано в комментариях, которые будут незаметно решать сложные проблемы:

In [64]: df=pd.DataFrame(list1)

In [65]: df2=df.apply(pd.to_numeric,errors='ignore')

In [66]: df2
Out[66]: 
        0       1                                 2
0  380850  625105                            Dota 2
1  354804  846193     PLAYERUNKNOWN'S BATTLEGROUNDS
2  204354  467109  Counter-Strike: Global Offensive

In [67]: df2.dtypes
Out[67]: 
0     int64
1     int64
2    object
dtype: object

df2.iloc[:,:2].values будет массивом numpy. Вы можете использоватьвсе ускорения в этой части.

0 голосов
/ 17 октября 2018

Ваш dtype не тот, который вы ожидаете - вы сталкиваетесь с https://github.com/numpy/numpy/issues/8969:

>>> dt = np.dtype('i,i,U')
>>> dt
dtype([('f0', '<i4'), ('f1', '<i4'), ('f2', '<U')])
>>> dt['f2'].itemsize
0  # 0-length strings!

Вам нужно либо указать максимальное количество символов

>>> dt = np.dtype('i,i,16U')

Или используйте тип object для хранения строк переменной длины:

>>> dt = np.dtype('i,i,O')
0 голосов
/ 17 октября 2018

Спасибо пользователю: комментарий 9769953 выше, это решение.

#when specifying strings you need to specify the length (derived from longest string in the list)
dtypestr = 'int, int, U' + str(max([len(i[2]) for i in plist1]))

cast_array = np.array([tuple(row) for row in plist1], dtype=dtypestr)

print(np.array(cast_array))
...