代码之家  ›  专栏  ›  技术社区  ›  Sahil Puri

numpy-张量乘法

  •  1
  • Sahil Puri  · 技术社区  · 8 年前

    我有一个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.tensordt和np.einsum,但没能搞清楚。

    谢谢, 萨希尔

    1 回复  |  直到 8 年前
        1
  •  1
  •   Divakar    8 年前

    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