Как лучше хранить объект Python для последующей оценки? - PullRequest
0 голосов
/ 27 декабря 2018

Я написал следующий код на Python, используя функцию scipy.Конкретная форма функции f не имеет значения.

import numpy as np
from scipy.interpolate.interpnd import LinearNDInterpolator    

def f(x, y):
    s = np.hypot(x, y)
    phi = np.arctan2(y, x)
    tau = s + s*(1-s)/5 * np.sin(6*phi)
    return 5*(1-tau) + tau

npts = 200
px, py = np.random.choice(x, npts), np.random.choice(y, npts)
ip = LinearNDInterpolator((px, py), f(px,py))

Что за объект ip?Я хотел бы сохранить его в файле и оценить его позже, как, например, ниже.

x = np.linspace(-1,1,100)
y = np.linspace(-1,1,100)
X, Y = np.meshgrid(x,y)
Ti = ip((X, Y))

Какой хороший способ сохранить объект ip в файле?

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Ваш объект ip является экземпляром класса scipy.interpolate.interpnd.LinearNDInterpolator.Если вы хотите сохранить весь объект в файл, вы можете использовать модуль pickle из стандартной библиотеки Python.

Выбор объекта и запись его в (двоичный) файлдовольно просто:

import pickle
with open('data.pickle', 'wb') as f:
    # Write object `ip` to file
    pickle.dump(ip, f, pickle.HIGHEST_PROTOCOL)

Более поздняя загрузка объекта из файла одинаково проста:

with open('data.pickle', 'rb') as f:
    # Read out object `ip` from file
    ip = pickle.load(f)

У травления есть несколько недостатков, о которых стоит упомянуть.Во-первых, файл рассола, который вы пишете, не читается человеком.Во-вторых, файлы pickle, полученные из ненадежного источника, никогда не должны загружаться из-за угроз безопасности.

0 голосов
/ 27 декабря 2018

Учитывая, что вы знаете f и имеете доступ к scipy, я бы сказал, что проще всего было бы просто хранить x и y.Это позволит избежать многих ловушек двоичного дампа и позволит вам хранить в текстовом формате.

Для хранения вы можете использовать np.savetxt для хранения данных:

np.savetxt('mystash.txt', np.stack((px, py), axis=1))

Затем можно выполнить простую процедуру загрузки, основанную на np.loadtxt:

def load_interp(fname):
    px, py = np.loadtxt(fname, unpack=True)
    return LinearNDInterpolator((px, py), f(px,py))

. Это решение создает очень читабельный текстовый файл с двумя столбцами данных.соответствующие соответствующие записи px и py.Файл полностью переносим и доступен для редактирования.Он не зависит от языка, все за счет одной дополнительной строки в загрузчике.

0 голосов
/ 27 декабря 2018

Вы можете рассмотреть pickle для сериализации специфичных для Python объектов.В противном случае вы должны рассмотреть формат json или xml.Посетите ссылку, чтобы понять больше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...