线性代数是数学的一个分支.
向量是指可以加总 (以生成新的向量), 可以乘以标量 (即数字), 也可以生成新的向量的对象.
图片. png
- import re, math, random # regexes, math functions, random numbers
- import matplotlib.pyplot as plt # pyplot
- from collections import defaultdict, Counter
- from functools import partial, reduce
- #
- # functions for working with vectors
- #
- def vector_add(v, w):
- """adds two vectors componentwise"""
- return [v_i + w_i for v_i, w_i in zip(v,w)]
- def vector_subtract(v, w):
- """subtracts two vectors componentwise"""
- return [v_i - w_i for v_i, w_i in zip(v,w)]
- def vector_sum(vectors):
- return reduce(vector_add, vectors)
- def scalar_multiply(c, v):
- return [c * v_i for v_i in v]
- def vector_mean(vectors):
- """compute the vector whose i-th element is the mean of the
- i-th elements of the input vectors"""
- n = len(vectors)
- return scalar_multiply(1/n, vector_sum(vectors))
- def dot(v, w):
- """v_1 * w_1 + ... + v_n * w_n"""
- return sum(v_i * w_i for v_i, w_i in zip(v, w))
- def sum_of_squares(v):
- """v_1 * v_1 + ... + v_n * v_n"""
- return dot(v, v)
- def magnitude(v):
- return math.sqrt(sum_of_squares(v))
- def squared_distance(v, w):
- return sum_of_squares(vector_subtract(v, w))
- def distance(v, w):
- return math.sqrt(squared_distance(v, w))
- #
- # functions for working with matrices
- #
- def shape(A):
- num_rows = len(A)
- num_cols = len(A[0]) if A else 0
- return num_rows, num_cols
- def get_row(A, i):
- return A[i]
- def get_column(A, j):
- return [A_i[j] for A_i in A]
- def make_matrix(num_rows, num_cols, entry_fn):
- """returns a num_rows x num_cols matrix
- whose (i,j)-th entry is entry_fn(i, j)"""
- return [[entry_fn(i, j) for j in range(num_cols)]
- for i in range(num_rows)]
- def is_diagonal(i, j):
- """1's on the 'diagonal', 0's everywhere else"""
- return 1 if i == j else 0
- identity_matrix = make_matrix(5, 5, is_diagonal)
- # user 0 1 2 3 4 5 6 7 8 9
- #
- friendships = [[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
- #####
- # DELETE DOWN
- #
- def matrix_add(A, B):
- if shape(A) != shape(B):
- raise ArithmeticError("cannot add matrices with different shapes")
- num_rows, num_cols = shape(A)
- def entry_fn(i, j): return A[i][j] + B[i][j]
- return make_matrix(num_rows, num_cols, entry_fn)
- def make_graph_dot_product_as_vector_projection(plt):
- v = [2, 1]
- w = [math.sqrt(.25), math.sqrt(.75)]
- c = dot(v, w)
- vonw = scalar_multiply(c, w)
- o = [0,0]
- plt.arrow(0, 0, v[0], v[1],
- width=0.002, head_width=.1, length_includes_head=True)
- plt.annotate("v", v, xytext=[v[0] + 0.1, v[1]])
- plt.arrow(0 ,0, w[0], w[1],
- width=0.002, head_width=.1, length_includes_head=True)
- plt.annotate("w", w, xytext=[w[0] - 0.1, w[1]])
- plt.arrow(0, 0, vonw[0], vonw[1], length_includes_head=True)
- plt.annotate(u"(vw)w", vonw, xytext=[vonw[0] - 0.1, vonw[1] + 0.1])
- plt.arrow(v[0], v[1], vonw[0] - v[0], vonw[1] - v[1],
- linestyle='dotted', length_includes_head=True)
- plt.scatter(*zip(v,w,o),marker='.')
- plt.axis('equal')
- plt.show()
实际上 NumPy 已经实现了上面功能. 更多 python 数据分析库 https://github.com/china-testing/python-api-tesing#数据分析data-analysis
可爱的 python 测试开发库 https://github.com/china-testing/python-api-tesing 请在 github 上点赞, 谢谢!
来源: http://www.jianshu.com/p/8d4e55d47bd5