Добавление перегрузки для класса, представляющего набор функций - PullRequest
1 голос
/ 10 апреля 2019

Я создаю класс my_class, чья единственная переменная экземпляра - member, пустой массив с измерениями (N, 2) для любого произвольного N.Предполагается, что этот класс представляет векторное пространство вещественных функций.Если A.member выглядит как

[[a_1, x_1], [a_2, x_2], ..., [a_N, x_N]]

, тогда A представляет функцию

f(x) = a_1 * k(x, x_1) + a_2* k(x, x_2) + ... + a_n * k(x, x_N)

, где k(x, y) - пред-выбранная функция.Я хочу перегрузить сложение для этого класса в здравом смысле, так что если A.member содержит [a, x_0], а B.member содержит [b, x_0], то (A + B).member содержит [a + b, x_0].Если A.member содержит [a, x_0] и B.member не содержит пары, в которой x_0 является вторым индексом, (A + B).member должен содержать [a, x_0].До сих пор я реализовал сложение следующим образом:

def __add__(self, other): 
    a = np.intersect1d(self.member[:,1], other.member[:,1], True, True)
    b = np.intersect1d(self.member[:,1], np.setdiff1d(self.member[:,1], a[0]),True, True)
    c = np.intersect1d(other.member[:,1], np.setdiff1d(other.member[:,1], a[0]),True, True)
    common = np.concatenate(((self.member[a[1],:][:,0] + other.member[a[2],:][:,0]).reshape(-1, 1), a[0].reshape(-1, 1)), 1)
    return my_class(np.concatenate((common, self.member[b[1],:], other.member[c[1],:]), 0))

Я думаю, что это слишком громоздко и не очень хорошо написано.Также в настоящее время мой код не удаляет записи вида [0, x_0], что было бы неплохо.Есть ли лучший способ реализовать это?Если это возможно, я бы хотел использовать массивы и не прибегать к словарям.

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