如何生成n维“单位矩阵”?

时间:2012-03-20 16:40:12

标签: functional-programming python-3.x

我正在构建一个演示任意维Vector类来展示Python中的一些函数式编程。

class Vector():
  def __init__(self, *coords):
    self.coords = coords
  def __add__(this, that):
    return Point(*[(x+y) for x,y in zip(this.coords, that.coords)])
  #...

在这个例子中试图想出一个静态@classmethod的例子时,我觉得有一个类方法给我一个任意{{1}的向量的n维基础是很好的。 }。那就是:

n
然而,我有一个巨大的脑屁,但我在如何“正确”生成这些列表的问题上磕磕绊绊。

我现在能想到的是一个声明性的解决方案:

>>> Vector.get_base(dimensions = 2)
[Vector(1,0), Vector(0,1)]
>>> Vector.get_base(3)
[Vector(1,0,0), Vector(0,1,0), Vector(0,0,1)]
>>> Vector.get_base(1)
[Vector(1)]

必须有更好的方法!如何以希望更简洁或Pythonic的功能风格重写此功能?

2 个答案:

答案 0 :(得分:1)

嗯,你可以这样做:

def get_base(dimensions):
    return [Vector(*coords) for coords in 
        [[(0,1)[i==j] for i in range(dimensions)] for j in range(dimensions)]]

但我会稍微分解一下:

def get_base(dimensions):
    arrays = [[(0,1)[i==j] for i in range(dimensions)] for j in range(dimensions)]
    return [Vector(*coords) for coords in arrays]

哪个更好。请记住,并非所有事情都必须是单行。

答案 1 :(得分:0)

下一个怎么样:

>>> def get_base(dimensions):
...     for points in set(itertools.permutations([0] * (dimensions - 1) + [1], dimensions)):
...             yield Vector(*points)