Я создаю класс 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]
, что было бы неплохо.Есть ли лучший способ реализовать это?Если это возможно, я бы хотел использовать массивы и не прибегать к словарям.