Преобразование массивов int в строковые массивы в numpy без усечения - PullRequest
27 голосов
/ 31 марта 2012

Попытка преобразовать 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 было достаточно большим, чтобы вместить мои самые длинныестрока.Есть ли способ сделать это легко, не зная заранее, какой размер строки вам нужен?Кажется немного опасным, что он просто тихо обрезает вашу строку, не выдавая ошибку.

Ответы [ 5 ]

37 голосов
/ 31 марта 2012

Опять же, это можно решить на чистом 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')
36 голосов
/ 01 апреля 2012

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

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

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

3 голосов
/ 31 марта 2012

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

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')
1 голос
/ 30 мая 2018

Используйте arr.astype(str), так как int в str преобразование теперь поддерживается numpy с желаемым результатом:

import numpy as np

a = np.array([0,33,4444522])

res = a.astype(str)

print(res)

array(['0', '33', '4444522'], 
      dtype='<U11')
0 голосов
/ 14 сентября 2016

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...