Python 使用旧版本的NumPy格式化二维数组

Python 使用旧版本的NumPy格式化二维数组,python,numpy,formatting,vectorization,partial-application,Python,Numpy,Formatting,Vectorization,Partial Application,我有一个代码片段,可以将2D数组格式化为特定的字符串格式。该代码段适用于最新版本的NumPy(例如1.9.2),但同样适用于当前版本的CentOS 6.6 NumPy 1.4.1 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/fu

我有一个代码片段,可以将2D数组格式化为特定的字符串格式。该代码段适用于最新版本的NumPy(例如1.9.2),但同样适用于当前版本的CentOS 6.6 NumPy 1.4.1

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>
这些值似乎是被剪裁为8个字符的字符串,本质上是垃圾

使用最新版本的NumPy的预期格式化结果为:

array([['  1.000000E+35', '  9.999999E+00', '  1.000000E+01']], type='|S14')

关于如何使用旧版本的NumPy获得预期输出,有什么建议吗?或者通常如何将数字数组的格式矢量化为字符数组?

如果您的输入数组是一维的,简单的列表理解就可以了:

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

仅供参考:您遇到的错误已在更新版本的numpy中修复:谢谢,但是我需要一个针对旧版本numpy的解决方案,因为这是我可用的支持版本。Does
vfmt=np.vectorize(“{:14.6E}.”格式)
work?任何返回字符串的
vectorize
d函数都将导致数据类型为
S8
,为您提供截断的字符串。@从Python 2.6.6开始,这种格式样式抛出“ValueError:格式中的零长度字段名”
>>> 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')