当数组中包含字符串数据时,我在使用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的输出。为什么会这样,我该如何获得正确的输出呢?谢谢!
Numpy需要字符串数组具有固定的最大长度。当您使用dtype=str
创建一个空数组时,默认情况下它将此最大长度设置为1。如果您执行my_array.dtype
,您会看到它显示为"|S1",表示“单字符字符串”。对该数组进行后续赋值时将截断以适应此结构。
您可以通过指定数据类型和最大长度来传递参数,例如:
my_array = numpy.empty([1, 2], dtype="S10")
"S10"将创建一个长度为10的字符串数组。您必须决定足够大以容纳要保存的所有数据。
当我尝试在dtype="S10"
中使用非ASCII字符时,出现了“编解码器错误”。
你也可以得到一个由二进制字符串组成的数组,这让我感到困惑。
我认为最好使用:
my_array = numpy.empty([1, 2], dtype="<U10")
这里的'U10'表示“长度为10的Unicode字符串;小端格式”。
dtype = "<U10"
的含义,这将是一个更好的答案。 - ericnumpy字符串数组的长度是固定的(默认长度为1)。如果您不确定在事先需要的字符串长度,可以使用dtype=object
来获取数据元素的任意长度字符串:
my_array = numpy.empty([1, 2], dtype=object)
我知道这种方法可能存在效率上的缺陷,但我没有一个好的参考来支持这一点。
如果有新手在这里,我猜现在还有另一种方法可以完成这项工作,只需要做一点点工作:
my_array = np.full([1, 2], "", dtype=np.object)
另一种选择是按以下方式初始化:
my_array = np.array([["CAT","APPLE"],['','']], dtype=str)
my_array[1,0] = 'PINEAPPLE'
那么存储的字符串将是'PINEA'。
data = ['CAT', 'APPLE', 'CARROT']
my_array = [name for name in data]
my_array[0] = 'hello'
),那么第一个元素是否仍具有分配的“10个字符的内存空间”?还是它现在真正是一个“S5”对象?我认为不是,因为numpy
数组的dtype必须在整个数组中保持一致。 - pretzlstyledtype=object
?它会更快吗? - Boern