You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.2 KiB
Python
79 lines
2.2 KiB
Python
6 years ago
|
"""
|
||
|
Lists as Vectors is actually not that performant. Numpy gives all of these features straight out of the box.
|
||
|
"""
|
||
|
import math
|
||
|
from typing import List
|
||
|
from functools import reduce
|
||
|
|
||
|
|
||
|
def vector_add(v: List[float], w: List[float]) -> List[float]:
|
||
|
"""Adds corresponding elements of two Vectors."""
|
||
|
return [v_i + w_i
|
||
|
for v_i, w_i in zip(v, w)]
|
||
|
|
||
|
|
||
|
def vector_subtract(v: List[float], w: List[float]) -> List[float]:
|
||
|
"""Subtracts corresponding elements of two Vectors."""
|
||
|
return [v_i - w_i
|
||
|
for v_i, w_i in zip(v, w)]
|
||
|
|
||
|
|
||
|
def vector_sum(vectors: List[List[float]]) -> List[float]:
|
||
|
"""Sums all corresponding elements."""
|
||
|
# result = vectors[0]
|
||
|
# for vector in vectors[1:0]:
|
||
|
# result = vector_add(result, vector)
|
||
|
# return result
|
||
|
return reduce(vector_add, vectors)
|
||
|
|
||
|
|
||
|
def scalar_multiple(c: float, v: List[float]) -> List[float]:
|
||
|
"""Scales a vector by a multiplier."""
|
||
|
return [c * vi for vi in v]
|
||
|
|
||
|
|
||
|
def vector_mean(vectors) -> List[float]:
|
||
|
"""Compute the vector whose ith element is the mean of the ith element
|
||
|
of the input vectors.
|
||
|
|
||
|
Allows us to calculate the component-wise means of a list of (same-sized)
|
||
|
vectors.
|
||
|
"""
|
||
|
n = len(vectors)
|
||
|
return scalar_multiple(1 / n, vector_sum(vectors))
|
||
|
|
||
|
|
||
|
def dot_product(v: List[float], w: List[float]) -> float:
|
||
|
"""The dot product of two vectors is the sum of their component wise
|
||
|
products.
|
||
|
|
||
|
The dot product measures how far vector v extends in the w direction.
|
||
|
"""
|
||
|
return sum(v_i * w_i for v_i, w_i in zip(v, w))
|
||
|
|
||
|
|
||
|
def sum_of_squares(v: List[float]) -> float:
|
||
|
return dot_product(v, v)
|
||
|
|
||
|
|
||
|
def magnitude(v: List[float]) -> float:
|
||
|
"""Calculates the magnitude (length) of a vector.
|
||
|
|
||
|
The pythagorean theorem a**2 + b**2 = c**2 actually is an example
|
||
|
of calculating the magnitude of a vector of length 2.
|
||
|
"""
|
||
|
return math.sqrt(sum_of_squares(v))
|
||
|
|
||
|
|
||
|
# def squared_distance(v: List[float], w: List[float]) -> float:
|
||
|
# """Calculates t
|
||
|
#
|
||
|
# """
|
||
|
# return sum_of_squares(vector_subtract(v, w))
|
||
|
|
||
|
|
||
|
def vector_distance(v: List[float], w: List[float]) -> float:
|
||
|
"""Calculates the distance between vectors."""
|
||
|
# return math.sqrt(squared_distance(v, w))
|
||
|
return magnitude(vector_subtract(v, w))
|