2015-09-28 2 views
1

У меня есть фрагмент кода для форматирования 2D-массива в определенном строчном формате. Фрагмент кода хорошо работает с последними версиями NumPy (например, 1.9.2), но то же самое происходит с NumPy 1.4.1, который является текущей версией для CentOS 6.6.Форматирование 2D-массива со старой версией NumPy

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

FYI: Вы работаете на ошибку, которая была исправлена ​​в новых версиях NumPy: https://github.com/numpy/numpy/issues/2485 –

+1

Спасибо, однако мне нужно решение для более старой версии NumPy, так как это поддерживаемая версия доступна мне. –

+0

Есть ли 'vfmt = np.vectorize ('{: 14.6E}'. Format)' work? – askewchan

ответ

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

Для 2-й массив, вложенный список понимание будет работать. Например, вот 2-d массив 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') 
Смежные вопросы