2017-02-13 56 views
0

我的应用程序的目的,我可以通过两种方式声明字符串数组:字符串连接(串)与numpy的阵列(串)

  1. 为列表strArr1 = [""] * 5

  2. 作为numpy的阵列strArr2 = numpy.empty([5], dtype=str)

然而,我看到以下差时,我尝试字符串连到数组元素。在第一种情况下,例如

strArr1[0] += 'a' 
strArr1[0] += 'b' 

给我如预期['ab', '', '', '', '']

然而,在第二种情况下,

strArr2[0] += 'a' 
strArr2[0] += 'b' 

给我结果['a', '', '', '', '']

为什么串联不能像numpy数组元素一样按预期工作?另外,考虑到我必须一次性扩展我的数组中的元素,任何人都可以提出一种有效的pythonic方法吗?

谢谢。

+0

你还在用这些列表或数组做什么?到目前为止,我没有看到使用数组形式的好理由。 – hpaulj

回答

0
  1. Numpy要求字符串数组具有固定的最大长度。您可以使用strArr2 = numpy.empty([5], dtype='S10'),其中10是每个项目可容纳的最大字符串,较长的子字符串将被截断。

    strArr2 = numpy.empty([5], dtype=object)这将使您可以将任意python对象存储到数组中,包括string

    请参阅Data type objects (dtype)

  2. 为了提高扩展字符串字符的效率,您可以尝试使用Python列表作为数据类型,然后使用append每个新字符到列表中。在所有字符完成后,使用join将列表转换回字符串。

+0

如果我声明'strArr2 = numpy.empty([5],dtype ='S10')',每个元素的类型为'numpy.bytes_',然后我不能将chars/str连接到这些元素。 –

+1

在Py3上试试'arr = np.zeros((5,),dtype ='U10')' - unicode在py3上是标准的。或者将你的添加标记为字节串,例如'arr [0] + = b'abc'' – hpaulj

+0

它适用于我('Numpy 1.11.2 with Python 2.7.12'),'type(strArr2 [0])''给出''。无论如何,使用'dtype = object'或方法2会更合适。 –

0

声明numpy.emptydtype='U10'工作,虽然无标记我的增补字节,即W/O b'abc',其失败。

最后,为了提高效率,我会遵循Neo X的建议,这应该避免行为中分布特定的异常。

P.S.我正在使用Numpy 1.10.4 with Python 3.5.1