繁体   English   中英

Numpy 来自数组,为每个元素创建一个矩阵 N*M ,所有值都设置为没有 for 循环的元素

[英]Numpy from an array, for each element create a matrix N*M with all values set as the element without for loops

我有一个 numpy 数组,例如 np.array([1, 2, 3])

不使用 for 循环,而只使用 numpy 或 pytorch 方法,我想要一个维度为 len(array) * N * M 的矩阵由矩阵 N*M 组成,第一个矩阵由所有矩阵组成,第二个矩阵仅由两个值和第三仅由 3 个值。

例如

N = 4 M = 3
[[[1,1,1,1],[1,1,1,1],[1,1,1,1]], 
  [[2,2,2,2],[2,2,2,2],[2,2,2,2]], 
  [[3,3,3,3],[3,3,3,3],[3,3,3,3]]]

我尝试了不同的方法来实现这个矩阵,比如 unsqueeze 和 repeat 但我找不到解决方案,有什么建议吗?

这里是 go:

np.ones((len(a),M,N)) * a[:,None,None]

或者没有乘法:

np.full((len(a),M,N), a[:,None,None])

Output:

array([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]],

       [[2., 2., 2., 2.],
        [2., 2., 2., 2.],
        [2., 2., 2., 2.]],

       [[3., 3., 3., 3.],
        [3., 3., 3., 3.],
        [3., 3., 3., 3.]]])

请注意此处的形状并在您预期的 output 中给出的形状是len(a) * M * N ,而不是len(a) * N * M 如果需要,在np.ones中交换M,N

在 PyTorch 你可以使用expand

a_t = torch.from_numpy(a)

a_t[:,None,None].expand(len(a_t), M, N)
tensor([[[1, 1, 1, 1],
         [1, 1, 1, 1],
         [1, 1, 1, 1]],

        [[2, 2, 2, 2],
         [2, 2, 2, 2],
         [2, 2, 2, 2]],

        [[3, 3, 3, 3],
         [3, 3, 3, 3],
         [3, 3, 3, 3]]], dtype=torch.int32)

另一种方法是使用repeat

a_t[:,None,None].repeat(1, M, N)

这类似于 numpy tile - np.tile(a[:,None,None], (1,M,N))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM