NumPy数组修剪字符串值

3

以下是我正在尝试执行的代码

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

我找到了问题所在。

将本地Python数组转换为Numpy应该作为最后一步进行。

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

现在运行良好。


1
数组并不是一种适合存储长度各异的数字和字符串混合数据格式的好选择。 - hpaulj

0

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

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

当您尝试添加长度超过11的新元素时,它将被截断为数据类型:

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

0

你的解决方案:

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

这个方法能够运行是因为如果在数组方法中不指定数据类型,numpy会将其设置为能够容纳所有数据的最小大小。

如果你在交互式python终端输入matrix[1][1],你会得到:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接