2017-02-13 59 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