Векторные вычисления в Python - PullRequest
0 голосов
/ 18 июня 2020

Если вам нужен простой скрипт для выполнения векторных вычислений в python, вы можете использовать его. Наслаждайтесь;) Других простых в использовании скриптов я не нашел, поэтому создал свой. Вы можете выполнить эти базовые c вычисления с векторным классом

  • sum
  • norm
  • скалярное произведение
  • cross product
  • эт c

1 Ответ

0 голосов
/ 18 июня 2020
import math
class Vector:
    def __init__(self, values):
        """
        create vector
        """
        self.__values = tuple(values)

    def get_values(self):
        """
        get the coordinates
        """
        return self.__values

    def get_size(self):
        """
        get number of coordinates
        """
        return len(self.get_values())

    def __add__(self, other):
        """
        add two vectors
        """
        if self.get_size() == other.get_size():
            return Vector(tuple(map(lambda x, y: x + y, self.get_values(), other.get_values())))

    def __eq__(self, other):
        """
        compare two vectors
        """
        if self.get_size() == other.get_size():
            return all(map(lambda x, y: x == y, self.get_values(), other.get_values()))

    def __mul__(self, other):
        """
        multiply by a scalar
        """
        return Vector(tuple(map(lambda x: x * other, self.get_values())))

    def scalar_product(self, other):
        """
        scalar product or dot product of two vectors
        """
        return Vector(tuple(map(lambda x, y: x * y, self.get_values(), other.get_values())))

    def cross_product(self, other):
        """
        Cross product
        """
        return Vector((self.get_values()[1] * other.get_values()[2] - self.get_values()[2] * other.get_values()[1], \
                       self.get_values()[2] * other.get_values()[0] - self.get_values()[0] * other.get_values()[2], \
                       self.get_values()[0] * other.get_values()[1] - self.get_values()[1] * other.get_values()[0]))

    def __str__(self):
        """
        printing a vector
        """
        return str(list(self.get_values()))

    def get_norm(self):
        """
        get the norm, or length
        """
        return math.sqrt(sum(self.get_values()[x] ** 2 for x in range(0, self.get_size())))

    def get_angle_radians(self, other):
        """
        angle between two vectors in radians
        """
        return math.acos(self.scalar_product(other).get_norm() / (self.get_norm() * other.get_norm()))

    def get_angle_degrees(self, other):
        """
            angle between two vectors in degrees
        """
        return 180 / math.pi * self.get_angle_radians(other)

    def get_direction(self):
        """
            get direction
        """
        return self * (1/ self.get_norm())

    def __sub__(self, other):
        """
        substract two vectors
        """
        return self+ (other*-1)

    def __truediv__(self,other):
        """
        devide two vectors
        """
        return self*(1/other)

vec1 = Vector((1, 2, 3))
vec2 = Vector((3, 2, 1))
vec3 = Vector((4, 4, 4))
vec4 = Vector((1, 1, 1))
vec5 = Vector((3, 4, 3))
vec6 = Vector((0, 0, 0))
vec7 = Vector((1, 1, 1, 1))
vec8 = Vector((0, 0, 1))
vec9 = Vector((1, 0, 0))
vec10 = Vector((-4,8,-4))
assert vec1 + vec2 == vec3
assert vec4 * 4 == vec3
assert Vector.scalar_product(vec1, vec2) == vec5
assert Vector.cross_product(vec4, vec3) == vec6
assert Vector.cross_product(vec1, vec2) == vec10
assert Vector.get_norm(vec7) == 2
assert Vector.get_angle_radians(vec8, vec9) == math.pi/2
assert Vector.get_angle_degrees(vec8, vec9) ==90
assert Vector.get_direction(vec9) == vec9
assert vec3-vec2 == vec1
assert vec3/4 == vec4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...