当数组包含字符串数据时,我对numpy有一些看似微不足道的麻烦。我有以下代码:
my_array = numpy.empty([1, 2], dtype = str)
my_array[0, 0] = "Cat"
my_array[0, 1] = "Apple"
现在,当我用print my_array[0, :]
打印时,我得到的回复是['C', 'A']
,这显然不是Cat和Apple的预期输出。为什么会这样,我怎样才能获得正确的输出?
谢谢!
答案 0 :(得分:41)
Numpy要求字符串数组具有固定的最大长度。使用dtype=str
创建空数组时,默认情况下将此最大长度设置为1。你可以看看你是否my_array.dtype
;它将显示“| S1”,表示“单字符串”。截断到数组的后续分配将适合此结构。
您可以通过例如:
传递具有最大长度的显式数据类型my_array = numpy.empty([1, 2], dtype="S10")
“S10”将创建一个长度为10的字符串数组。你必须决定大到足以容纳你想要保留的所有数据。
答案 1 :(得分:7)
我收到了#34;编解码器错误"当我尝试使用dtype="S10"
您还会得到一个包含二进制字符串的数组,这让我很困惑。
我认为最好使用:
my_array = numpy.empty([1, 2], dtype="<U10")
答案 2 :(得分:5)
numpy字符串数组受其固定长度限制(默认长度为1)。如果您不确定事先需要字符串的长度,可以使用dtype=object
并获取数据元素的任意长度字符串:
my_array = numpy.empty([1, 2], dtype=object)
我知道这种方法可能存在效率上的缺陷,但我没有很好的参考支持。
答案 3 :(得分:0)
另一种方法是初始化如下:
my_array = np.array([["CAT","APPLE"],['','']], dtype=str)
换句话说,首先你用你想要的东西写一个常规数组,然后把它变成一个numpy数组。但是,这会将最大字符串长度修复为初始化时最长字符串的长度。所以,如果你要添加
my_array[1,0] = 'PINEAPPLE'
然后存储的字符串将是&#39; PINEA&#39;。
答案 4 :(得分:0)
如果执行for循环,最有效的方法是启动列表理解,这将允许您分配正确的内存。
data = ['CAT','APPLE,'CARROT']
my_array = [name for name in data]
答案 5 :(得分:0)
如果有任何新来的人,我想现在还有另一种方法可以完成这项工作,只需要做一些工作:
my_array = np.full([1, 2], "", dtype=np.object)
使用np.full代替np.empty,并创建一个带有空字符串(类型为object)的数组。