метод str () для массива numpy и обратно - PullRequest
0 голосов
/ 29 августа 2018

Есть ли какой-нибудь встроенный метод для возврата массива numpy после применения метода str(), например,

import numpy as np
a = np.array([[1.1, 2.2, 3.3], [4.4, 5.5, 6.6]])
a_str = str(a)

#to get back a?
a = some_method(a_str).

Следующие два метода не работают:

from ast import literal_eval
a = literal_eval(a_str)  # Error

import numpy as np
a = np.fromstring(a_str)  # Error

Обновление 1: К сожалению, у меня есть очень большие данные, уже преобразованные методом str(), поэтому я не могу преобразовать их другим методом.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы можете сделать это с помощью repr:

import numpy as np
a = np.array([[1.1, 2.2, 3.3], [4.4, 5.5, 6.6]])
a_str = repr(a)
b = eval("np." + repr(a))
print(repr(a))
print(repr(b))
0 голосов
/ 29 августа 2018

Основными проблемами, похоже, являются разделители и символы новой строки. Вы можете использовать np.array2string и str.splitlines для их разрешения:

import numpy as np
from ast import literal_eval

a = np.array([[1.1, 2.2, 3.3], [4.4, 5.5, 6.6]])

a_str = ''.join(np.array2string(a, separator=',').splitlines())

# '[[ 1.1, 2.2, 3.3], [ 4.4, 5.5, 6.6]]'

b = np.array(literal_eval(a_str))

# array([[ 1.1,  2.2,  3.3],
#        [ 4.4,  5.5,  6.6]])

Обратите внимание, что без любых аргументов np.array2string ведет себя как str.


Если ваша строка задана и неизбежна, вы можете использовать этот хакерский метод:

a_str = str(a)
res = np.array(literal_eval(''.join(a_str.replace('\n', ' ').replace('  ', ','))))

array([[ 1.1,  2.2,  3.3],
       [ 4.4,  5.5,  6.6]])

Согласно комментарию @ hpaulj, одним из преимуществ np.array2string является возможность указать threshold. Например, рассмотрим строковое представление x = np.arange(10000).

  • str(x) вернет многоточие, например, '[ 0 1 2 ..., 9997 9998 9999]'
  • np.array2string(x, threshold=11e3) вернет полную строку
...