【问题标题】:String concatenation in Python list (of strings) vs. numpy array (of strings)Python列表(字符串)与numpy数组(字符串)中的字符串连接
【发布时间】:2017-02-13 05:06:55
【问题描述】:

就我的应用而言,我可以通过两种方式声明一个字符串数组:

  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方法吗?

谢谢。

【问题讨论】:

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

标签: python arrays list numpy string-concatenation


【解决方案1】:
  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 将列表转换回字符串。

【讨论】:

  • 如果我声明strArr2 = numpy.empty([5], dtype='S10'),每个元素的类型都是numpy.bytes_,然后我不能将chars/str连接到这些元素。
  • 在 Py3 上尝试 arr=np.zeros((5,), dtype='U10') - unicode 是 py3 上的标准。或者将您的添加标记为字节字符串,例如arr[0] += b'abc'
  • 它对我很有效 (Numpy 1.11.2 with Python 2.7.12),type(strArr2[0]) 给了<type 'numpy.string_'>。无论如何,使用dtype=object或方法2会更合适。
【解决方案2】:

dtype='U10' 声明numpy.empty 有效,尽管没有将我的添加标记为字节,即没有b'abc',但失败了。

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

附:我正在使用Numpy 1.10.4 with Python 3.5.1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 2010-09-27
    • 2017-02-04
    • 2017-08-21
    • 2017-09-29
    • 2016-07-19
    • 2011-12-06
    相关资源
    最近更新 更多