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