【问题标题】:Creating a 4 dimensional tensor mask in numpy在 numpy 中创建 4 维张量掩码
【发布时间】:2020-07-25 06:32:24
【问题描述】:

在研究问题时,我遇到了以下 4 级张量掩码:

M[i,j,k,l] = delta(i+j,k+l)

其中 delta(x,y) = 1 如果 x==y,否则为 0(克罗内克三角洲)

例如 M(2,3,1,4) = 1 因为 (2+3=1+4) 但是 M(1,3,2,4)= 0 因为 (1+3 不是 2+4 )

是否有使用 numpy 的矢量化方法来创建它?如果我使用 for 循环,我必须经历 N^4 次迭代,这对于我当前的 N 值来说已经太多了。 还有内存问题。

【问题讨论】:

  • 乳胶在这里不起作用。最好分享一个小例子和预期的输出

标签: python numpy mask tensor


【解决方案1】:

改编 https://stackoverflow.com/a/18860925/2062663 的建议,您可以尝试使用 Numpy 的 meshgrid 如下:

import numpy as np


def get_mask(shape):
    i, j, k, l = np.meshgrid(*map(np.arange, shape),
                             sparse=1,
                             indexing='ij')
    return i + j == k + l

这里有几个测试用例:

def test_1():
    expected = np.array([[[[1]]]])
    actual = get_mask((1, 1, 1, 1))
    assert actual == expected


def test_2():
    expected = np.array([[[[1, 0], [0, 0]],
                          [[0, 1], [1, 0]]],
                         [[[0, 1], [1, 0]],
                          [[0, 0], [0, 1]]]])

    actual = get_mask((2, 2, 2, 2))
    assert (actual == expected).all()


def test_4():
    actual = get_mask((4, 4, 4, 4))
    assert actual[1, 2, 0, 3] == 1
    assert actual[1, 1, 2, 0] == 1
    assert actual[0, 2, 1, 3] == 0
    assert actual[3, 2, 0, 3] == 0

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2021-02-22
    • 2019-11-05
    相关资源
    最近更新 更多