2012-12-05 23 views
15

当数组包含字符串数据时,我遇到了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'],这显然不是猫和苹果的预期输出。为什么是这样,我怎样才能得到正确的输出?

谢谢!

回答

28

Numpy要求字符串数组具有固定的最大长度。当您使用dtype=str创建一个空数组时,它默认将此最大长度设置为1。你可以看看你是否my_array.dtype;它会显示“| S1”,意思是“单字符串”。数组中的后续赋值被截断以适应该结构。

你可以做你的最大长度传递一个明确的数据类型,例如:

my_array = numpy.empty([1, 2], dtype="S10") 

的“S10”,将创建长度为10的字符串数组。你必须决定有多大才能保存你想要保存的所有数据。

+0

这是正确的,很高兴知道!谢谢 – Jim

+0

一旦我更新列表中的一个元素(即'my_array [0] ='hello''),那么第一个元素是否仍然具有分配的“10个字符值”的内存?还是现在真的是一个“S5”对象?我假设不是,因为'numpy'数组的'dtype'必须在整个数组中保持一致? – Anonymous

+0

@jphollowed:对,整个数组的大小是固定的,所以如果将它初始化为S10,即使存储的实际字符串较小,每个条目仍会占用10个字节。 – BrenBarn

2

我得到了一个“编解码器错误”当我试图使用非ASCII字符与dtype="S10"

您还可以得到一个数组,二进制字符串,这让我感到困惑。

我认为这是更好地使用:

my_array = numpy.empty([1, 2], dtype="<U10")

1

的numpy的串阵列通过其固定长度(长度为1默认情况下)的限制。如果你不确定什么长度你需要提前为你的字符串,你可以使用dtype=object并获得任意长度的字符串为您的数据元素:

my_array = numpy.empty([1, 2], dtype=object) 

我的理解可能会有效率缺点这种方法,但我没有很好的参考来支持这一点。

+0

是否有任何警告(如速度较慢),比如说“S10”? – Boern

0

另一种方法是初始化如下:

my_array = np.array([["CAT","APPLE"],['','']], dtype=str) 

换句话说,首先你写你想要什么样的规则阵列,然后你把它变成一个numpy的阵列。但是,这会将最大字符串长度固定为初始化时最长字符串的长度。因此,如果您要添加

my_array[1,0] = 'PINEAPPLE' 

那么存储的字符串将是'PINEA'。