使用旧版本的NumPy

时间:2015-09-28 23:00:38

标签: python numpy formatting vectorization partial-application

我有一个代码片段,用于将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获得预期输出的任何建议?或者一般如何将数值数组的格式化矢量化为字符数组?

1 个答案:

答案 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')