Подтвердить что ты не робот

Преобразование int массивов в строковые массивы в numpy без усечения

Попытка конвертировать int массивы в строковые массивы в numpy

In [66]: a=array([0,33,4444522])
In [67]: a.astype(str)
Out[67]: 
array(['0', '3', '4'], 
      dtype='|S1')

Не то, что я намеревался

In [68]: a.astype('S10')
Out[68]: 
array(['0', '33', '4444522'], 
      dtype='|S10')

Это работает, но я должен был знать, что 10 был достаточно большим, чтобы держать мою самую длинную строку. Есть ли способ сделать это легко, не зная заранее, какую строку размера вам нужно? Кажется немного опасным, что он просто тихо усекает вашу строку, не вызывая ошибки.

4b9b3361

Ответ 1

Опять же, это можно решить в чистом Python:

>>> map(str, [0,33,4444522])
['0', '33', '4444522']

Или если вам нужно конвертировать туда и обратно:

>>> a = np.array([0,33,4444522])
>>> np.array(map(str, a))
array(['0', '33', '4444522'], 
      dtype='|S7')

Ответ 2

Вы можете оставаться в numpy, делая

np.char.mod('%d', a)

Это в два раза быстрее, чем map или списки для 10 элементов, в четыре раза быстрее для 100. Эта и другие строковые операции документированы здесь.

Ответ 3

Вы можете найти наименьшую достаточную ширину:

In [3]: max(len(str(x)) for x in [0,33,4444522])
Out[3]: 7

В качестве альтернативы просто создайте ndarray из списка строк:

In [7]: np.array([str(x) for x in [0,33,4444522]])
Out[7]: 
array(['0', '33', '4444522'], 
      dtype='|S7')

или, используя map():

In [8]: np.array(map(str, [0,33,4444522]))
Out[8]: 
array(['0', '33', '4444522'], 
      dtype='|S7')

Ответ 4

np.apply_along_axis(lambda y: [str(i) for i in y], 0, x)

Пример

>>> import numpy as np

>>> x = np.array([-1]*10+[0]*10+[1]*10)
array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1])

>>> np.apply_along_axis(lambda y: [str(i) for i in y], 0, x).tolist()
['-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '0', '0',
 '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1',
 '1', '1', '1', '1']