将Numpy代码翻译成C#

时间:2014-09-22 15:45:44

标签: c# python numpy

我怀疑这可能不是一个很好的问题,但是我已经完全碰到了它,可以使用一些帮助。

我试图实现此代码:

http://www.nathanieltroutman.net/content/calculating-minimum-volume-bounding-box

在C#中,原文在Python中。

在我点击此部分之前,情况一直很好:

def calcProjections(points, *vectors):
    """Calculates the projection of points (NxD) onto the vectors 
    (MxD) and return the projections p which is a matrix sized (N, M) 
    where N is the number of points and M is the number of vectors.
    p[i][j], is the projection of points[i] onto vectors[j] (which is
    between 0 and 1)."""

    u = np.array(vectors)

    # project the points onto the vectors into on fell swoop
    d = np.dot(points, u.T)

    # this is the dot product of each vector with itself
    v2 = np.diag(np.inner(u, u))

    p = d / v2

    return p

我正在努力破译实际发生的事情。我不确定作者的意思是投射到特定的向量,或输出的格式(该死的你打字)。对我来说,这种描述有点过于模糊。

有没有人对这是做什么有任何建议或解释?非常感谢任何帮助。

感谢。

1 个答案:

答案 0 :(得分:1)

这是一个示例计算,在交互式Ipython shell中完成:

In [63]: points=np.arange(12,dtype=float).reshape(4,3)
In [64]: vectors=[np.array([1,0,0],dtype=float),np.array([0,1,1],dtype=float)]
In [65]: u=np.array(vectors)
In [66]: points
Out[66]: 
array([[  0.,   1.,   2.],
       [  3.,   4.,   5.],
       [  6.,   7.,   8.],
       [  9.,  10.,  11.]])
In [67]: u
Out[67]: 
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  1.]])
In [68]: d=np.dot(points, u.T)
In [69]: d
Out[69]: 
array([[  0.,   3.],
       [  3.,   9.],
       [  6.,  15.],
       [  9.,  21.]])
In [70]: v2=np.diag(np.inner(u,u))
In [71]: d/v2
Out[71]: 
array([[  0. ,   1.5],
       [  3. ,   4.5],
       [  6. ,   7.5],
       [  9. ,  10.5]])

如函数doc中所指定,输入为(4,3) pointsvectors列出2 (3,)个向量,输出为(4,2)数组,p

d是4x3矩阵与2x3(或转置后,3x2)阵列的矩阵(点)乘积,得到4x2。 v2也可以计算为np.sum(u,u, axis=1),即2'向量的大小。 p只是按v2标准化的点积。

如果您熟悉爱因斯坦求和符号(用于物理学),计算也表示为:

np.einsum('ij,kj->ik',points,u)/np.einsum('ij,ij->i',u,u)