2013-09-26 2 views
0

Мой вопрос в основном состоит в том, что задается (и не отвечает) в «Q2» this previous question.Изменение dtype строковых массивов нулей из строковых данных

У меня есть структурированный массив со столбцом строк и столбцом целых чисел. Я заменяю строки целыми числами с помощью dict, но поскольку тип этого столбца не изменяется, целые числа записываются как строки. Я могу изменить dtype столбца на целое число, но тогда все строки преобразуются в 0 вместо целых значений в каждой строке. Как изменить столбец таким образом, чтобы целочисленные значения не были потеряны во время преобразования dtype?

Я создал иллюстративный пример:

dat = np.array([('1', 3392),('2', 4159),('1', 1093),('1', 9836)], dtype=[('code', 'U24'),('id', 'i2')]) 
dat.astype(dtype=[('code', 'i4'), ('id', 'i2')]) 

Но по причинам, я не могу понять, это на самом деле работает, получая:

array([(1, 3392), (2, 4159), (1, 1093), (1, 9836)], 
    dtype=[('code', '<i4'), ('id', '<i2')]) 

Это то, что я хочу! Вместо этого, по некоторым причинам, я получаю эквивалент:

array([(0, 3392), (0, 4159), (0, 1093), (0, 9836)], 
    dtype=[('code', '<i4'), ('id', '<i2')]) 

Что может вызвать все значения «код», чтобы быть обнулены, как это, если на самом деле, это не ожидаемый результат от ndarray.astype? Благодарю. (В случае, если это актуально, я использую Python 3.)

EDIT: Вот моментальный снимок фактических данных после обработки с помощью dict.

array([('1', 2814), ('1', 1185), ('1', 6836), ('2', 7057), ('1', 5403),... 

    ('1', 1642), ('1', 3967), ('2', 7982), ('1', 6139), ('1', 9934), 
    ('2', 9932), ('1', 3044), ('1', 2769)], 
    dtype=[('name', '<U24'), ('id', '<i2')]) 
+0

Примеры данных об отказах? – Veedrac

+0

Я не могу поделиться оригинальными данными или фактическим dict, который я использовал для соображений неприкосновенности частной жизни, но я отредактировал исходный вопрос с куском данных после запуска его через dict. – trynthink

ответ

0

Я думаю, что вы делаете это:

baddata = numpy.array([('1', 2814), ('1', 1185), ('1', 6836), ('2', 7057), ('1', 5403), 
    ('1', 1642), ('1', 3967), ('2', 7982), ('1', 6139), ('1', 9934), 
    ('2', 9932), ('1', 3044), ('1', 2769)], 
    dtype=[('name', '<U24'), ('id', '<i2')]) 

baddata.astype([('code', 'i4')]) 
#>>> array([(0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,), (0,), 
#>>>  (0,), (0,)], 
#>>>  dtype=[('code', '<i4')]) 

Когда вы призваны делать это:

baddata = numpy.array([('1', 2814), ('1', 1185), ('1', 6836), ('2', 7057), ('1', 5403), 
    ('1', 1642), ('1', 3967), ('2', 7982), ('1', 6139), ('1', 9934), 
    ('2', 9932), ('1', 3044), ('1', 2769)], 
    dtype=[('name', '<U24'), ('id', '<i2')]) 

baddata.astype([('name', 'i4')]) 
#>>> array([(1,), (1,), (1,), (2,), (1,), (1,), (1,), (2,), (1,), (1,), (2,), 
#>>>  (1,), (1,)], 
#>>>  dtype=[('name', '<i4')]) 

Примечание имена.

+0

Ты абсолютно прав. Когда я использовал 'ndarray.astype', я менял тип на строку _and_, меняя имя столбца одновременно. Оригинальный dtype был: '[('name', 'U24'), ('id', 'i2')]' и я пытался изменить dtype на: '[('type', 'i4'), ('id', 'i2')] '. Как говорится, есть ли конкретная причина, почему имя столбца и тип данных нельзя изменить одновременно? – trynthink

+0

Я не понимаю, как вы меняете имя. Имя ссылается на столбец, когда вы «меняете» имя, которое вы фактически отбрасываете старый столбец и инициализируете новый. Попробуйте 'baddata.astype ([('foo', ' Veedrac

+0

И ошибка, и вопрос возникают из-за отсутствия фундаментального понимания того, что делает dtype, но теперь я знаю лучше. Благодарю. – trynthink

Смежные вопросы