Python: применение арифметических c операторов в списке, как в numpy .ndarray? - PullRequest
1 голос
/ 01 апреля 2020

вот мой первый код, использующий метод numpy .linspace:

import numpy as np
import matplotlib.pyplot as plt


def graph(formula, string, x1, x2):
    x = np.linspace(x1, x2)
    y = formula(string, x)
    plt.plot(x, y)


def my_formula(string, x):
    return eval(string)


graph(my_formula, "2 * (x ** 3) - 9.5 * (x ** 2) + 10.5 * x", 0, 3)
plt.tight_layout()
plt.show()

, он работает нормально, однако вместо импорта numpy, если я делаю это:

import matplotlib.pyplot as plt


class Module:
    @staticmethod
    def linspace(finish, slices, start=0):
        each = float((finish - start) / (slices - 1))
        res = list()
        for i in range(slices):
            res.append(start + i * each)
        return res


def graph(formula, string, x1, x2):
    x = Module.linspace(x2, 50, start=x1)
    y = formula(string, x)
    plt.plot(x, y)


def my_formula(string, x):
    return eval(string)


graph(my_formula, "2 * (x ** 3) - 9.5 * (x ** 2) + 10.5 * x", 0, 3)
plt.tight_layout()
plt.show()

Появляется ошибка:

Traceback (most recent call last):
File "C:/Users/QINY/PycharmProjects/begin/covid/seven.py", line 24, in <module> graph(my_formula, "2 * (x ** 3) - 9.5 * (x ** 2) + 10.5 * x", 0, 3)
File "C:/Users/QINY/PycharmProjects/begin/covid/seven.py", line 16, in graph y = formula(string, x) File "C:/Users/QINY/PycharmProjects/begin/covid/seven.py", line 21, in my_formula return eval(string)
File "<string>", line 1, in <module> TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'

Может кто-нибудь объяснить, как это делается в numpy .adarray, чтобы автоматически повторять список?

1 Ответ

2 голосов
/ 01 апреля 2020

Они используют Стандартные операторы в качестве функций .

Их тип поддерживает функции, такие как __pow__, __mul__, __add__, et c ... с реализациями, которые применяются операции над каждым элементом ndarray (очень эффективно ...)

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

...