现在的位置: 首页 > 综合 > 正文

【Python】Coding the Matrix:Week 2 The Vector Space

2013年09月12日 ⁄ 综合 ⁄ 共 2181字 ⁄ 字号 评论关闭

这周的作业还比较少,Python的语言确实比较精简,所以如果代码写的优雅的话,代码量可是很少的哦!

基本上用Comprehension就可以完成了,因为vec.py实现了Vec的加法和乘法,所以可以使用sum函数计算Vec的和,注意Problem2里面的乘法是没有实现交换律的,所以a*Vec成立而Vec*a是会报错的,我就是这个卡了好久。Problem3里面利用了Python库 import itertools然后计算L的组合,之后再将每一个排列组合加起来,因为计算出来的list会有成员的冗余和多一个0所以删除掉第一个0元素,取而代之的是Vec(D,{})空向量,再加一个全部元素的排列组合的和就好了。

代码如下:

# version code 761
# Please fill out this stencil and submit using the provided submission script.

from vec import Vec
from vec import *
import itertools


## Problem 1
def vec_select(veclist, k): 
    '''
    >>> D = {'a','b','c'}
    >>> v1 = Vec(D, {'a': 1})
    >>> v2 = Vec(D, {'a': 0, 'b': 1})
    >>> v3 = Vec(D, {        'b': 2})
    >>> v4 = Vec(D, {'a': 10, 'b': 10})
    >>> vec_select([v1, v2, v3, v4], 'a') == [Vec(D,{'b': 1}), Vec(D,{'b': 2})]
    True
    '''
    return [x for x in veclist if x[k]==0]

def vec_sum(veclist, D): 
    '''
    >>> D = {'a','b','c'}
    >>> v1 = Vec(D, {'a': 1})
    >>> v2 = Vec(D, {'a': 0, 'b': 1})
    >>> v3 = Vec(D, {        'b': 2})
    >>> v4 = Vec(D, {'a': 10, 'b': 10})
    >>> vec_sum([v1, v2, v3, v4], D) == Vec(D, {'b': 13, 'a': 11})
    True
    '''
    return Vec(D,{k:sum([x[k] for x in veclist]) for k in D})

def vec_select_sum(veclist, k, D): 
    '''
    >>> D = {'a','b','c'}
    >>> v1 = Vec(D, {'a': 1})
    >>> v2 = Vec(D, {'a': 0, 'b': 1})
    >>> v3 = Vec(D, {        'b': 2})
    >>> v4 = Vec(D, {'a': 10, 'b': 10})
    >>> vec_select_sum([v1, v2, v3, v4], 'a', D) == Vec(D, {'b': 3})
    True
    '''
    return vec_sum(vec_select(veclist,k),D)



## Problem 2
def scale_vecs(vecdict):
    '''
    >>> v1 = Vec({1,2,3}, {2: 9})
    >>> v2 = Vec({1,2,4}, {1: 1, 2: 2, 4: 8})
    >>> scale_vecs({3: v1, 5: v2}) == [Vec({1,2,3},{2: 3.0}), Vec({1,2,4},{1: 0.2, 2: 0.4, 4: 1.6})]
    True
    '''
    #return [k*v for (k,v) in vecdict]
    return [(1/k)*vecdict[k] for k in vecdict]



## Problem 3
def GF2_span(D, L):
    '''
    >>> from GF2 import one
    >>> D = {'a', 'b', 'c'}
    >>> L = [Vec(D, {'a': one, 'c': one}), Vec(D, {'b': one})]
    >>> len(GF2_span(D, L))
    4
    >>> Vec(D, {}) in GF2_span(D, L)
    True
    >>> Vec(D, {'b': one}) in GF2_span(D, L)
    True
    >>> Vec(D, {'a':one, 'c':one}) in GF2_span(D, L)
    True
    >>> Vec(D, {x:one for x in D}) in GF2_span(D, L)
    True
    '''
    vecp=[]
    if len(L)==0:return Vec(D,{})
    for i in range(len(L)):
        vecp.append(itertools.permutations(L,i))
    #vecp.remove(vecp[0])
    #vecp.append(Vec(D,{}))
    vecp=[sum(x) for y in vecp for x in y]
    vecp.remove(vecp[0])
    vecp.append(Vec(D,{}))
    vecp.append(sum(L))
    return vecp


## Problem 4
# Answer with a boolean, please.

is_it_a_vector_space_1 = True
is_it_a_vector_space_2 = False



## Problem 5
is_it_a_vector_space_3 = True
is_it_a_vector_space_4 = False


## Problem 6

is_it_a_vector_space_5 = True
is_it_a_vector_space_6 = False

抱歉!评论已关闭.