假设我有数组VARCHAR
和a
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有问题,如何解决?
答案 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个字符的字符串的数组。但是请注意,如果将最大长度变大,矩阵的大小将增加。