首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pandas中最有效的矩阵行乘算法

Pandas中最有效的矩阵行乘算法
EN

Stack Overflow用户
提问于 2016-09-05 15:30:06
回答 1查看 1.7K关注 0票数 4

假设我有这样一个矩阵

代码语言:javascript
运行
复制
df = pd.DataFrame(randint(2,size=(3,9)))
df.values
array([[0, 1, 0, 1, 1, 1, 0, 1, 1],
       [1, 0, 1, 1, 1, 1, 0, 0, 1],
       [0, 0, 0, 1, 0, 0, 1, 1, 0]])

同样,本例中的每一行表示三个需要旋转的三维坐标,例如,以下旋转矩阵:

代码语言:javascript
运行
复制
array([[  0.00000000e+00,   0.00000000e+00,   1.00000000e+00],
       [  0.00000000e+00,   1.00000000e+00,   0.00000000e+00],
       [ -1.00000000e+00,   0.00000000e+00,   0.00000000e+00]])

为了尽可能有效地做到这一点(实际问题有数百万坐标),我有些困惑,我不得不这样做:

首先应用df.reshape --本例中的每一行都包含三个3D坐标,即: so (x,y,z),(x,y,z),(x,y,z)

代码语言:javascript
运行
复制
array([[0, 1, 0],
       [1, 1, 1],
       [0, 1, 1],
       [1, 0, 1],
       [1, 1, 1],
       [0, 0, 1],
       [0, 0, 0],
       [1, 0, 0],
       [1, 1, 0]])

然后,为了得到轮流到约定,必须取u_new = R \dot u,这意味着上面的转置,这样我们就可以用旋转矩阵进行一列方向(即坐标)乘法。

代码语言:javascript
运行
复制
array([[0, 1, 0, 1, 1, 0, 0, 1, 1],
       [1, 1, 1, 0, 1, 0, 0, 0, 1],
       [0, 1, 1, 1, 1, 1, 0, 0, 0]])

然后我们可以做乘法:

代码语言:javascript
运行
复制
pd.DataFrame(dot(rotmat,df)).values

array([[  0.00e+00,   2.22e-16,   0.00e+00,   1.00e+00,   2.22e-16,
          2.22e-16,   1.00e+00,   1.00e+00,   2.22e-16],
       [  1.00e+00,   0.00e+00,   1.00e+00,   1.00e+00,   1.00e+00,
          1.00e+00,   0.00e+00,   0.00e+00,   1.00e+00],
       [  0.00e+00,  -1.00e+00,   0.00e+00,  -1.00e+00,  -1.00e+00,
         -1.00e+00,   2.22e-16,  -1.00e+00,  -1.00e+00]])

然后反转整个过程,使其回到原来的形状,用于其他目的。

当然,必须有更有效的方法来做到这一点(希望不干扰旋转矩阵)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-05 23:16:28

在您完成转换之前,这不应该触及数据文件。

代码语言:javascript
运行
复制
a = np.array([
        [0, 1, 0, 1, 1, 1, 0, 1, 1],
        [1, 0, 1, 1, 1, 1, 0, 0, 1],
        [0, 0, 0, 1, 0, 0, 1, 1, 0]
    ])

rotmat = np.array([
        [  0.00000000e+00,   0.00000000e+00,   1.00000000e+00],
        [  0.00000000e+00,   1.00000000e+00,   0.00000000e+00],
        [ -1.00000000e+00,   0.00000000e+00,   0.00000000e+00]
    ])

a.reshape(3, 3, -1).dot(rotmat).reshape(-1, 9)

array([[ 0.,  1.,  0., -1.,  1.,  1., -1.,  1.,  0.],
       [-1.,  0.,  1., -1.,  1.,  1., -1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  0.,  1.,  1.]])
代码语言:javascript
运行
复制
df = pd.DataFrame(a.reshape(3, 3, -1).dot(rotmat).reshape(-1, 9))
df

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39333750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档