【问题标题】:python matrix vs numpy matrix. What am I doing wrong?python矩阵与numpy矩阵。我究竟做错了什么?
【发布时间】:2012-10-13 01:41:49
【问题描述】:

我正在尝试用 Python 进行一些 3D 渲染。我一直在读 Python 太慢了!我只是必须利用 Numpy 的 C-awesomeness 来处理我在着色器中无法完成的所有矩阵内容!否则什么都行不通,yadda,yadda(在这里转述..)。

但是:我做了一些测试!

这是一个随机矩阵,一次是 Numpy 风格的:

matrix1 = numpy.matrix([[1, 1, 0, 0,], [0, 1, 0, 0], [0, 0, 1, 1], [0, 0, 0, 1]])
>>> matrix([[1, 1, 0, 0],
            [0, 1, 0, 0],
            [0, 0, 1, 1],
            [0, 0, 0, 1]])

曾经作为一个沼泽标准元组:

matrix2 = (1, 1, 0, 0,\
      0, 1, 0, 0,\
      0, 0, 1, 1,\
      0, 0, 0, 1)

现在,如果我想要反过来,我可以在 Numpy 中完成:

def inv_1():
    return matrix1.I

或者作为纯 Python(我省略了一些数学,因为它让我头疼):

def inv_2():
    m0, m1, m2, m3, \
    m4, m5, m6, m7, \
    m8, m9, m10, m11, \
    m12, m13, m14, m15 = matrix2

    A0 = (( m0 *  m5) - ( m1 *  m4))  ....
 ...B5 = ((m10 * m15) - (m11 * m14))

    det = 1.0 / det
    return (
        (+ ( m5 * B5) - ( m6 * B4) + ( m7 * B3)) * det, ...
     ...(+ ( m8 * A3) - ( m9 * A1) + (m10 * A0)) * det
    )

两者都可以正常工作:

inv_1()
>>>> matrix([[ 1., -1.,  0.,  0.],
             [ 0.,  1.,  0.,  0.],
             [ 0.,  0.,  1., -1.],
             [ 0.,  0.,  0.,  1.]])

inv_2()
>>>> (1.0, -1.0, 0.0, 0.0, 
      0.0, 1.0, 0.0, 0.0, 
      0.0, 0.0, 1.0, -1.0,
      0.0, 0.0, 0.0, 1.0)   (I added the line-breaks here for clarity)

但是纯 Python 代码的运行速度始终如一比备受赞誉的 Numpy 快十倍:

timeit.timeit(inv_1, number=100000)
>>>> 3.0659120082855225

timeit.timeit(inv_2, number=100000)
>>>> 0.4014430046081543

如果你加上将我漂亮的元组矩阵转换为 Numpy 矩阵的开销,它会更慢。

那么这里发生了什么?难道我做错了什么?这完全是由于调用 C 函数的开销造成的吗?我偷的反码的那个人违反了物理定律吗?

感谢您拒绝我!爱你们!

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您正在分析地反转矩阵(这是可能的,因为您知道尺寸并且它们不是太大)。 numpy 必须使用其他一些(数字)算法反转矩阵,如果矩阵是 4x4 以及 10000x10000,则该算法有效。换句话说,一般问题比您拥有的简单 4x4 案例要困难得多。

    【讨论】:

    • 一个好点!慢的不是语言而是算法。 Python 对于小 N 来说是完全可以接受的,尤其是因为您可以针对特定情况制定快速算法。
    • @ThaneBrimhall -- 是的,但是,我有点担心“分析”版本在数值实现时可能在数值上不稳定(除非作者以某种形式构建旋转)......虽然,我已经有一段时间没有使用任何矩阵求逆算法了,所以我的记忆可能对那个有点生疏......
    猜你喜欢
    • 2013-06-05
    • 2016-07-18
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多