【问题标题】:numpy - tensor multiplication productnumpy - 张量乘积
【发布时间】:2019-01-07 01:10:13
【问题描述】:

我有一个 4 x 4 矩阵

import numpy as np
c = np.random.rand((4,4))

我想创建一个 100 x 4 x 4 x 100 的张量,这样当第一个和最后一个索引相等时,我会返回我的矩阵,否则我会得到零。

我可以在循环中这样做

Z = np.zeros((100, 4, 4, 100))
for i in range(100):
    Z[i, :, :, i] = c

有没有更好的方法来做到这一点?我尝试查看 np.tensordot 和 np.einsum 但无法弄清楚。

谢谢, 萨希尔

【问题讨论】:

    标签: python numpy tensor


    【解决方案1】:

    使用advanced-indexing -

    n = 100
    Zout = np.zeros((n, 4, 4, n))
    I = np.arange(n)
    Zout[I,:,:,I] = c
    

    eye-masking -

    n = 100
    mask = np.eye(n, dtype=bool)
    Zout = np.zeros((n, 4, 4, n))
    Zout.transpose(0,3,1,2)[mask] = c
    

    时间安排 -

    In [72]: c = np.random.rand(4,4)
    
    In [73]: %%timeit
        ...: n = 100
        ...: Zout = np.zeros((n, 4, 4, n))
        ...: I = np.arange(n)
        ...: Zout[I,:,:,I] = c
    10000 loops, best of 3: 47.5 µs per loop
    
    In [74]: %%timeit
        ...: n = 100
        ...: mask = np.eye(n, dtype=bool)
        ...: Zout = np.zeros((n, 4, 4, n))
        ...: Zout.transpose(0,3,1,2)[mask] = c
    10000 loops, best of 3: 73.1 µs per loop
    

    【讨论】:

    • 非常感谢。我希望有一些功能需要np.eye(100)c 来提供Z
    • @SahilPuri 索引与 np.eye 不会那么有效,我想。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 2019-09-10
    相关资源
    最近更新 更多