替换numpy数组中的值时,防止字符串被截断

时间:2018-10-10 13:17:40

标签: python arrays numpy

假设我有数组VARCHARa

b

如果我要对这些数组应用像这样的精美索引

a = np.array([1,2,3])
b = np.array(['red','red','red'])

我得到的输出是

b[a<3]="blue"

我知道问题是因为numpy最初只为3个字符分配空间,因此它不能将整个单词blue都适合数组,我该怎么办?

当前我正在做

array(['blu', 'blu', 'red'], dtype='<U3')

但这只是一种解决方法,这是我代码中的错误吗?还是numpy有问题,如何解决?

3 个答案:

答案 0 :(得分:4)

您可以通过将dtype的{​​{1}}设置为b来处理可变长度的字符串:

"object"

此输出:

import numpy as np
a = np.array([1,2,3])
b = np.array(['red','red','red'], dtype="object")

b[a<3] = "blue"

print(b)

['blue' 'blue' 'red'] 将处理字符串或其他常规Python对象。这也必然意味着在幕后您将拥有dtype指针数组,因此不要指望使用原始数据类型时获得的性能。

答案 1 :(得分:3)

当前方法的边际改进(在空间上可能非常浪费):

import numpy as np

a = np.array([1,2,3])
b = np.array(['red','red','red'])

replacement = "blue"
b = b.astype('<U{}'.format(max(len(replacement), a.dtype.itemsize)))
b[a<3] = replacement
print(b)

这说明了数组中已经存在的字符串,因此仅当replacement长于数组中所有现有的字符串时,分配的空间才会增加。

答案 2 :(得分:2)

如果构造这样的数组,则类型如下:

>>> b
array(['red', 'red', 'red'], dtype='<U3')

这意味着字符串的长度最多为3个字符。如果您分配了更长的字符串,这些字符串会被截断

您可以更改数据类型以增加最大长度,例如:

b2 = b.astype('<U10')

所以现在我们有了一个可以存储最多10个字符的字符串的数组。但是请注意,如果将最大长度变大,矩阵的大小将增加。