我正在尝试使用切片表示法将numpy数组中的一些条目分配给单个unicode值(来自另一个数组),但是如下面的代码段所示,我正在回垃圾:
>>> 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。我可以围绕这个问题提出各种方法,但我的问题是:获得我期待的结果的最佳(最pythonic,最快,最通用)解决方案是什么?
这个的上下文是我试图将一堆数组从不规则的时间序列扩展到数组,用于一系列不同类型(float,int,unicode等)的数组的常规时间序列,所以我更愿意找到适用于任何类型的解决方案而不需要很多'if isinstance'条款。
答案 0 :(得分:0)
问题的一个更紧凑的例子,在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 bug。但我还没有找到它。也许这个将一个数组值分配给另一个数组的任务是不寻常的,特别是在Py2中处理unicode字符串时。