gpt4 book ai didi

arrays - 有效地堆叠阵列/ torch 张量的副本?

转载 作者:行者123 更新时间:2023-12-04 11:50:32 26 4
gpt4 key购买 nike

我是 Python/Pytorch 用户。首先,在 numpy 中,假设我有一个大小为 LxL 的数组 M,我想要以下内容
数组:A=(M,...,M) 的大小,例如 NxLxL,是否有比以下更优雅/内存效率更高的方法:

A=np.array([M]*N) ?

与火炬张量相同的问题!
原因,现在,如果 M 是一个变量(torch.tensor),我必须这样做:
A=torch.autograd.Variable(torch.tensor(np.array([M]*N))) 

这是丑陋的!

最佳答案

请注意,您需要决定是要为扩展数组分配新内存,还是仅需要原始数组现有内存的新 View 。

在 PyTorch 中,这种区别产生了两种方法 expand()repeat() .前者仅在现有张量上创建一个新 View ,其中通过将步幅设置为 0 将大小为 1 的维度扩展到更大的大小。任何大小为 1 的维度都可以扩展为任意值,而无需分配新的内存。相比之下,后者复制原始数据并分配新内存。

在 PyTorch 中,您可以使用 expand()repeat()为您的目的如下:

import torch

L = 10
N = 20
A = torch.randn(L,L)
A.expand(N, L, L) # specifies new size
A.repeat(N,1,1) # specifies number of copies

在 Numpy 中,有多种方法可以更优雅、更有效地实现您在上面所做的工作。对于您的特定目的,我会推荐 np.tile()np.repeat() , 自 np.repeat()旨在对数组的特定元素进行操作,而 np.tile()旨在对整个阵列进行操作。因此,
import numpy as np

L = 10
N = 20
A = np.random.rand(L,L)
np.tile(A,(N, 1, 1))

关于arrays - 有效地堆叠阵列/ torch 张量的副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44593141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com