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

Jim*_*Jim 31 python numpy

当数组包含字符串数据时,我对numpy有一些看似微不足道的麻烦.我有以下代码:

my_array = numpy.empty([1, 2], dtype = str)
my_array[0, 0] = "Cat"
my_array[0, 1] = "Apple"
Run Code Online (Sandbox Code Playgroud)

现在,当我打印时print my_array[0, :],我得到的回应是['C', 'A'],这显然不是Cat和Apple的预期输出.为什么会这样,我怎样才能获得正确的输出?

谢谢!

Bre*_*arn 45

Numpy要求字符串数组具有固定的最大长度.使用时创建空数组时dtype=str,默认情况下将此最大长度设置为1.你可以看看你是否这样做my_array.dtype; 它将显示"| S1",表示"单字符串".对数组的后续赋值将被截断以适合此结构.

您可以通过执行最大长度的显式数据类型,例如:

my_array = numpy.empty([1, 2], dtype="S10")
Run Code Online (Sandbox Code Playgroud)

"S10"将创建一个长度为10的字符串数组.您必须决定大到足以保存您想要保留的所有数据.

  • @orodbhen 最好进行抽象和[泄露](https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/) 然后永远不要抽象...... (2认同)

小智 9

当我尝试使用非ascii字符时,我收到了"编解码器错误" dtype="S10"

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

我认为最好使用:

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

  • 如果它解释了 `dtype = "&lt;U10"` 是什么,这将是一个改进的答案。 (2认同)

spi*_*nup 6

numpy字符串数组受其固定长度限制(默认长度为1).如果您不确定事先需要字符串的长度,可以使用dtype=object并获取数据元素的任意长度字符串:

my_array = numpy.empty([1, 2], dtype=object)
Run Code Online (Sandbox Code Playgroud)

我知道这种方法可能存在效率上的缺陷,但我没有很好的参考支持.