Рубрики
Без рубрики

Матрицы в Python

Примечание автора: это продолжение векторов, которая является частью главы линейной алгебры от DA … Tags Python, DataScience, MachineLearning.

ПРИМЕЧАНИЕ Автора : Это продолжение векторы , которая является частью главы линейной алгебры от Наука данных с нуля Джоэл Грус .

Матрицы

Первое, что нужно отметить, это то, что матрицы представлены как списки из списки Что явно с аннотацией типа:

from typing import List

Matrix = List[List[float]]

Вы могли бы поспорить, зададясь, если список из списки каким -то образом отличается от список из векторы Ранее мы видели с Vector_sum функция Чтобы увидеть, я использовал Тип аннотации Чтобы попытаться определить аргументы по -другому Анкет

Вот Vector_sum функция, которую мы определили ранее:

def vector_sum(vectors: List[Vector]) -> Vector:
    """Sum all corresponding elements (componentwise sum)"""
    # Check that vectors is not empty
    assert vectors, "no vectors provided!"
    # Check the vectorss are all the same size
    num_elements = len(vectors[0])
    assert all(len(v) == num_elements for v in vectors), "different sizes!"
    # the i-th element of the result is the sum of every vector[i]
    return [sum(vector[i] for vector in vectors)
            for i in range(num_elements)]

assert vector_sum([[1,2], [3,4], [5,6], [7,8]]) == [16,20]

Вот Новый функция, Vector_sum2 определяется по -разному с Тип аннотации :

def vector_sum2(lists: List[List[float]]) -> List:
   """Sum all corresponding list (componentwise sum?)"""
   assert lists, "this list is empty!"
   # check that lists are the same size
   num_lists = len(lists[0])
   assert all(len(l) == num_lists for l in lists), "different sizes!"
   # the i-th list is the sum of every list[i]
   return [sum(l[i] for l in lists)
           for i in range(num_lists)]

assert vector_sum2([[1,2], [3,4], [5,6], [7,8]]) == [16,20]

Я сделал множество вещей, чтобы увидеть, если Vector_sum и Vector_sum2 вел себя по -другому, но они кажутся идентичными:

# both are functions
assert callable(vector_sum) == True
assert callable(vector_sum2) == True

# when taking the same argument, they both return a list
type(vector_sum([[1,2], [3,4], [5,6], [7,8]])) #list
type(vector_sum2([[1,2], [3,4], [5,6], [7,8]])) #list

# the same input yields the same output
vector_sum([[1,2],[3,4]])    # [4,6]
vector_sum2([[1,2],[3,4]])   # [4,6]

Чтобы сделать это просто, в контексте матрицы , вы можете думать о векторы как ряды матрицы Анкет

Например, если мы представляем небольшой набор данных ниже как Матрица , мы можем думать о столбцы как переменные, такие как: рост, вес, возраст; и каждый ряд как человек:

sample_data = [[70, 170, 40],
               [65, 120, 26],
               [77, 250, 19]]

По расширению ряды и столбцы , мы можем написать функцию для формы матрицы. Это ниже форма Функция принимает матрицу и возвращает кортеж с двумя целыми числами, количеством рядов и количество столбцов:

from typing import Tuple

def shape(A: Matrix) -> Tuple[int, int]:
    """Returns (# of rows of A, # of columns of A)"""
    num_rows = len(A)
    num_cols = len(A[0]) if A else 0  # number of elements in first row
    return num_rows, num_cols

assert shape([[1,2,3], [4,5,6]]) == (2,3) # 2 rows, 3 columns
assert shape(sample_data) == (3,3)

На самом деле мы можем написать функции, чтобы захватить любое конкретное ряд или конкретный столбцы :

Vector = List[float]

# rows
def get_row(A: Matrix, i: int) -> Vector:
    """Returns the i-th row of A (as a Vector)"""
    return A[i]  # A[i] is already the ith row

# column
def get_column(A: Matrix, i: int) -> Vector:
    """Returns the j-th column of A (as a Vector)"""
    return [A_i[j]
            for A_i in A]

Теперь, выходя за рамки поиска формы, рядов и столбцов существующей матрицы, мы также захотим Создать Матрицы, и мы сделаем это с помощью Вложенные списки понимание :

from typing import Callable

def make_matrix(num_rows: int,
                num_cols: int,
                entry_fn: Callable[[int, int], float]) -> Matrix:
    """
    Returns a num_rows x num_cols matrix
    whose (i,j)-th entry is entry_fn(i, j)
    """
    return [[entry_fn(i,j)            # given i, create a list
            for j in range(num_cols)] # [entry_fn(i, 0), ...]
            for i in range(num_rows)] # create one list for each i

Тогда мы на самом деле Используйте Make_matrix Функция для создания специального типа матрицы называется Матрица личности :

def identity_matrix(n: int) -> Matrix:
    """Returns the n x n identity matrix"""
    return make_matrix(n, n, lambda i, j: 1 if i == j else 0)

assert identity_matrix(5) == [[1, 0, 0, 0, 0],
                              [0, 1, 0, 0, 0],
                              [0, 0, 1, 0, 0],
                              [0, 0, 0, 1, 0],
                              [0, 0, 0, 0, 1]]

Резюме

Чтобы убедиться, что есть Другие типы матриц , но в этой главе мы лишь кратко исследуем ее строительство, чтобы воспитать нас.

Мы знаем, что матрицы можно использовать для представления данных, каждый ряд В наборе данных – это вектор Анкет Потому что мы также можем знать матрицы колонка , мы будем использовать его для представления линейных функций, которые Карта K-меры векторы для n-мерных векторов Анкет

Наконец, матрицы также могут быть использованы для картирования Бинарные отношения Анкет

Воспоминание о гл.1

В наш первый день в DataScienster ™ нам дали Дружба_PAIRS данные:

friendship_pairs = [(0,1), (0,2), (1,2), (1,3), (2,3), (3,4),
                    (4,5), (5,6), (5,7), (6,8), (7,8), (8,9)]

Эти Дружба_PAIRS также может быть представлен в форме матрицы:

#            user 0  1  2  3  4  5  6  7  8  9
friend_matrix = [[0, 1, 1, 0, 0, 0, 0, 0, 0, 0], # user 0
                 [1, 0, 1, 1, 0, 0, 0, 0, 0, 0], # user 1
                 [1, 1, 0, 1, 0, 0, 0, 0, 0, 0], # user 2
                 [0, 1, 1, 0, 1, 0, 0, 0, 0, 0], # user 3
                 [0, 0, 0, 1, 0, 1, 0, 0, 0, 0], # user 4
                 [0, 0, 0, 0, 1, 0, 1, 1, 0, 0], # user 5
                 [0, 0, 0, 0, 0, 1, 0, 0, 1, 0], # user 6
                 [0, 0, 0, 0, 0, 1, 0, 0, 1, 0], # user 7
                 [0, 0, 0, 0, 0, 0, 1, 1, 0, 1], # user 8
                 [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]] # user 9

Это позволяет нам очень быстро проверить, являются ли два пользователя друзьями или нет:

assert friend_matrix[0][2] == 1, "0 and 2 are friends"
assert friend_matrix[0][8] == 0, "0 and 8 are not friends"

И если мы хотим проверить, чтобы проверить друг каждого пользователя, мы могли бы:

# checking the friends of user at index five (Clive)
friends_of_five = [i
                  for i, is_friend in enumerate(friend_matrix[5])
                  if is_friend]

# checking the friends of user at index zero (Hero)
friends_of_zero = [i
                   for i, is_friend in enumerate(friend_matrix[0])
                   if is_friend]

assert friends_of_five == [4,6,7]
assert friends_of_zero == [1,2]

Для получения дополнительного содержания в области данных, машинного обучения, R, Python, SQL и других, Найди меня в Твиттере Анкет

Оригинал: “https://dev.to/paulapivat/matrices-in-python-1oh3”