[英]How to compare each element of an array with another entire array without loops in numpy
[英]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.