ПРИМЕЧАНИЕ Автора : Это продолжение векторы , которая является частью главы линейной алгебры от Наука данных с нуля Джоэл Грус .
Матрицы
Первое, что нужно отметить, это то, что матрицы
представлены как списки
из списки
Что явно с аннотацией типа:
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”