奇怪的行为初始化一个numpy字符串数据数组

时间:2012-12-05 06:29:54

标签: python numpy

当数组包含字符串数据时,我对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的预期输出。为什么会这样,我怎样才能获得正确的输出?

谢谢!

6 个答案:

答案 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"

的非ascii字符时

您还会得到一个包含二进制字符串的数组,这让我很困惑。

我认为最好使用:

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)的数组。