Numpy数组修剪字符串值

时间:2016-09-30 15:42:37

标签: python numpy

以下是我要执行的代码

matrix = []
sample = [10,10,'mike','']
for i in range(10):
    r = [sample] * 3
    matrix.append(r)

matrix = np.array(matrix)
matrix[1][1] = [123,123,'james', 'sdfsdfsdf werwerwer sdfsdfsd werwerwer sdfsdfsdf']
print matrix[1][1]

这就是我得到的

['123' '123' 'james' 'sdfsdfsdf w']

因此基本上由于某种原因修剪了文本。有没有人见过它?

3 个答案:

答案 0 :(得分:0)

我发现了问题。

从本机Python数组转换为Numpy应该作为最后一步。

matrix[1][1] = [123,123,'james', 'sdfsdfsdf werwerwer sdfsdfsd werwerwer sdfsdfsdf']
matrix = np.array(matrix)

现在工作正常。

答案 1 :(得分:0)

如果在将列表转换为数组时未指定dtype,则它将使用默认行为。在您的情况下,您正在混合int和字符串,因此它将默认为unicode< 11:

>>> np.array([1,2,'a'])
array(['1', '2', 'a'],
dtype='<U11')

当您尝试添加长度大于11的新元素时,它将截断为dtype:

>>> x = np.array([1,2,'a'])
>>> x[2] = 'abcdefghijklmnopqrstuvwxyz'
>>> x
array(['1', '2', 'abcdefghijk'],
      dtype='<U11')

您可以在创建阵列时指定更高的dtype来解决此问题:

>>> x = np.array([1,2,'a'], '<U50')
>>> x[2] = 'abcdefhijkmnopqrstuvwxyz'
>>> x
array(['1', '2', 'abcdefhijkmnopqrstuvwxyz'],
      dtype='<U50')

答案 2 :(得分:0)

您的解决方案:

matrix[1][1] = [123,123,'james', 'sdfsdfsdf werwerwer sdfsdfsd werwerwer sdfsdfsdf']
matrix = np.array(matrix)

只是因为如果你没有在数组方法中指定数据类型,那么numpy将它设置为可能保存所有数据的最小尺寸。

如果你从一个您输入matrix[1][1]的interactice python终端获得了:

array(['123', '123', 'james', 'sdfsdfsdf werwerwer s'], dtype='|S21')

dtype表示它是一个长度为21个字符的字符串。这就是为什么你的文字会被截断的原因。实现数组结构时,如果稍后想要增加数据大小,则应提供dtype。

matrix = np.array(matrix, dtype='S50')
matrix[1][1] = [123,123,'james', 'sdfsdfsdf werwerwer sdfsdfsd werwerwer sdfsdfsdf']
print matrix[1][1]

['123' '123' 'james' 'sdfsdfsdf werwerwer sdfsdfsd werwerwer sdfsdfsdf']