我有一个代码片段,用于将2D数组格式化为特定的字符串格式。代码片段适用于最新版本的NumPy(例如1.9.2),但同样是NumPy 1.4.1失败,这是CentOS 6.6的当前版本。
import numpy as np
cfmt = '%14.6E'
vfmt = np.vectorize(cfmt.__mod__)
Traceback (most recent call last):
File "/usr/lib64/python2.6/site-packages/numpy/lib/function_base.py", line 1762, in __init__
nin, ndefault = _get_nargs(pyfunc)
File "/usr/lib64/python2.6/site-packages/numpy/lib/function_base.py", line 1694, in _get_nargs
raise ValueError, 'failed to determine the number of arguments for %s' % (obj)
ValueError: failed to determine the number of arguments for <method-wrapper '__mod__' of str object at 0xb461e0>
从Numpy-discussion开始,functools.partial
似乎存在问题,建议使用lambda
解决方法。但是,这是我失败的尝试:
vfmt1 = np.vectorize(lambda x: cfmt.__mod__(x))
vfmt2 = np.vectorize(lambda x: cfmt % (x,), ['|S14']) # attempt to specify otype
# A 2D array with shape (1, 3)
ar = np.array([[1.0e35, 9.999999, 10.0]])
print(vfmt1(ar)) # [[' 1.0000' ' 9.9999' ' 1.0000']]
print(vfmt2(ar)) # [[' 1.0000' ' 9.9999' ' 1.0000']]
这些值似乎是剪裁为8个字符的字符串,实际上是垃圾。
使用最近版本的NumPy的预期格式化结果是:
array([[' 1.000000E+35', ' 9.999999E+00', ' 1.000000E+01']], type='|S14')
有关如何使用旧版NumPy获得预期输出的任何建议?或者一般如何将数值数组的格式化矢量化为字符数组?
答案 0 :(得分:2)
如果你的输入数组是一维的,那么简单的列表理解就可以了:
>>> ar
array([ 1.00000000e+35, 9.99999900e+00, 1.00000000e+01])
>>> ar2 = np.array(["%14.6E" % v for v in ar])
>>> ar2
array([' 1.000000E+35', ' 9.999999E+00', ' 1.000000E+01'],
dtype='|S14')
对于二维数组,嵌套列表理解将起作用。例如,这里是一个二维数组x
:
>>> x
array([[ 1.00000000e+35, 9.99999900e+00, 1.00000000e+01],
[ 1.23450000e-04, 0.00000000e+00, 1.23000000e+02]])
这里是嵌套列表理解,它创建了一个字符串列表列表:
>>> [["%14.6E" % v for v in row] for row in x]
[[' 1.000000E+35', ' 9.999999E+00', ' 1.000000E+01'], [' 1.234500E-04', ' 0.000000E+00', ' 1.230000E+02']]
如果您需要将结果设置为numpy数组,只需将其置于np.array
的调用中:
>>> np.array([["%14.6E" % v for v in row] for row in x])
array([[' 1.000000E+35', ' 9.999999E+00', ' 1.000000E+01'],
[' 1.234500E-04', ' 0.000000E+00', ' 1.230000E+02']],
dtype='|S14')