【问题标题】:Trouble assigning array slice to unicode value将数组切片分配给 unicode 值时遇到问题
【发布时间】:2016-02-28 19:55:44
【问题描述】:

我正在尝试使用切片表示法将 numpy 数组中的多个条目分配给单个 unicode 值(来自另一个数组),但如下面的 sn-p 所示,我得到了垃圾:

>>> import numpy as np
>>> a = np.array([u'America/Los_Angeles']*3)
>>> a
array([u'America/Los_Angeles', u'America/Los_Angeles',
       u'America/Los_Angeles'],
      dtype='<U19')
>>> s = np.zeros(10,dtype=a.dtype)
>>> s
array([u'', u'', u'', u'', u'', u'', u'', u'', u'', u''],
      dtype='<U19')
>>> s[0:2] = a[0]
>>> s
array([ u'\uf300\udc41\uf440\udc65\uf080\udc69\ue380\udc61\uf380\udc4c\uef80\udc73\uf340\udc41\uf100\udc67\uf100\udc6cs\uf8ad\ude98\u7ff5\x00\x00\x01\x00\x02\ud7bf\udfff\uf77c\udc30',
       u'\uf300\udc41\uf440\udc65\uf080\udc69\ue380\udc61\uf380\udc4c\uef80\udc73\uf340\udc41\uf100\udc67\uf100\udc6cs\uf8ad\ude98\u7ff5\x00\x00\x01\x00\x02\ud7bf\udfff\uf77c\udc30',
       u'', u'', u'', u'', u'', u'', u'', u''],
      dtype='<U19')

当使用 python 2.7.3 和 numpy 1.6.2 运行它时,我没有问题,得到了我的预期:

>>> s
array([u'America/Los_Angeles', u'America/Los_Angeles', u'', u'', u'', u'',
       u'', u'', u'', u''],
      dtype='<U19')

但这显然在 python 2.7.10 和 numpy 1.9.2 中发生了变化。我可以想出各种方法来解决这个问题,但我的问题是:获得预期结果的最佳(最 Python、最快、最通用)的解决方案是什么?

这里的上下文是我试图将一堆数组从不规则时间序列扩展为规则时间序列的数组,用于一堆不同类型(float、int、unicode 等)的数组,所以我更愿意找到适用于任何类型的解决方案,而无需大量“if isinstance”子句。

【问题讨论】:

  • 使用 Python3.4 和 numpy 1.8.2,我得到了你所期望的 s(py3 没有显示 u,但它仍然是 U19)。
  • 在 Py2.7,np 1.9 中,a[0] 出现此错误,a[[0]]a[0].item() 则没有。换句话说,当分配的值是类型np.unicode_,但不是np.ndarrayunicode
  • 谢谢。我已经选择了 a.item(0);简单而通用。

标签: arrays python-2.7 numpy unicode slice


【解决方案1】:

一个更简洁的问题示例,在 PY2.7 中,numpy 1.9

In [126]: s=np.zeros(1,dtype='U10')

In [127]: s[:]=np.unicode_('abc')

In [128]: s
Out[128]: 
array([u'\uf040\udc61c\ua982\udee8'], 
      dtype='<U10')

没有切片,或者有标量,没问题

In [129]: s[0]=np.unicode_('abc')

In [130]: s
Out[130]: 
array([u'abc'], 
      dtype='<U10')

In [131]: s[:]=u'abc'

In [132]: s
Out[132]: 
array([u'abc'], 
      dtype='<U10')

或者使用较小的s,我可以通过视图查看单个字节:

In [154]: s=np.zeros(1,dtype='U3')

In [155]: s[:]=np.unicode_('abc')

In [156]: s
Out[156]: 
array([u'\uf040\udc61c\ua982\udcd0'], 
      dtype='<U3')

In [157]: s.view('U1')
Out[157]: 
array([u'\uf040\udc61', u'c', u'\ua982\udcd0'], 
      dtype='<U1')

In [158]: s.view('S1')
Out[158]: 
array(['a', '', 'b', '', 'c', '', '', '', '\xd0', '\x08', 'G', '\xb7'], 
      dtype='|S1')

In [159]: s.view('S12')
Out[159]: 
array(['a\x00b\x00c\x00\x00\x00\xd0\x08G\xb7'], 
      dtype='|S12')

In [176]: np.array(u'abc').view('S12')
Out[176]: 
array('a\x00\x00\x00b\x00\x00\x00c', 
      dtype='|S12')

感觉就像以前提出的那种问题,无论是在这里还是作为 numpy 错误。但我还没有找到。也许将一个数组值分配给另一个数组中的切片的任务是不寻常的,尤其是在 Py2 中使用 unicode 字符串时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2018-07-05
    • 2014-02-18
    • 1970-01-01
    相关资源
    最近更新 更多