在没有截断的情况下将int数组转换为numpy中的字符串数组

时间:2012-03-31 19:10:51

标签: python 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足够大,可以保持我最长的弦。有没有办法在不事先知道你需要什么尺寸的字符串的情况下轻松完成这项工作?它似乎有点危险,它只是悄悄截断你的字符串而不会抛出错误。

5 个答案:

答案 0 :(得分:37)

同样,这可以用纯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')

答案 1 :(得分:35)

你可以保持笨拙,做

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

这比10个元素的map或列表推导快两倍,100的速度快了四倍。这个和其他字符串操作都记录在案here

答案 2 :(得分: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')

答案 3 :(得分:1)

使用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')

答案 4 :(得分:0)

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']