2013-11-28 3 views
2

Кто-нибудь может объяснить, что здесь происходит?Преобразование кортежа в массив numpy искажает данные

import numpy as np 

test1 = ((154L, u'D2'), (155L, u'D2'), (156L, u'D2')) 
print np.asarray(test1) 

дает

[[u'15' u'D2'] 
[u'15' u'D2'] 
[u'15' u'D2']] 

но с

test2 =((154L, u'SG2'), (155L, u'SG2'), (156L, u'SG1')) 
print np.asarray(test2) 

получает

[[u'154' u'SG2'] 
[u'155' u'SG2'] 
[u'156' u'SG1']] 

Что случилось с длинным целым числом в test1

ответ

0

Насколько я понимаю, он имеет отношение к поддержке unicode, как вы показываете: в первом случае все 6 элементов округляются до двух символов. Они являются длинными целыми числами, поскольку вы их вводите, но если вы делаете numpy.asarray(), они становятся строками unicode с той же длиной, что и самая длинная строка юникода, которая была в исходном массиве. В первом случае это 2 символа, а во втором случае - 3. Таким образом, длинные целые числа изменяют тип данных, чтобы стать строками unicode той же длины, что и самая длинная строка юникода во входном массиве. В этот момент последние цифры исчезают (не знаю, почему, хотя любой, у кого больше опыта в unicode, знает, будет ли это предназначено, или если это будет ошибкой?)

Редактировать: нашел решение: укажите dtype как unicode (и получить длину правильный)

test3 =((154L, u'SG'), (15L, u'SG3'), (1564L, u'SG')) 

print(numpy.asarray(test3, dtype='<U4')) 

[[u'154' u'SG'] 
[u'15' u'SG3'] 
[u'1564' u'SG']] 

так что в этом случае «DTYPE = ...» означает Юникода максимальной длины 4, и результаты в правом массиве

+0

Любая идея, как это исправить? –

+0

@OlivierCloarec Нашел решение и отредактировал мой ответ – usethedeathstar

+0

Отлично! Большое спасибо!!! –

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