numpy 如何在1D TorchTensor之间添加元素?

kd3sttzy  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(176)

我有一个维度为([384])的1D TorchTensor。我想在这个Tensor的每个奇数索引后面加上零或其他数字,最终将其维数加倍为([768])。更具体地说,考虑[0, 1, 2,..., 382, 383]作为我的TorchTensor的索引。假设 * 是零/数字的索引,我想插入并制作一个像[0, 1, *, 2, 3, *,...]这样的Tensor。
我唯一的解决方案是在for循环中插入这些元素,但这会很耗时。由于我必须对数百个Tensor进行这些更改,我想知道PyTorch或NumPy是否有更快的函数来执行此操作!

6qfn3psc

6qfn3psc1#

我不知道有什么直接的方法可以达到你的要求。我认为下面的代码(使用torch.tensor索引)比您正在寻找的代码更复杂,但为了以防万一它对您有帮助,我还是把它留在这里。

import torch
import numpy as np

# Original tensor
your_1D_tensor_length = 6
original_tensor = torch.tensor(range(your_1D_tensor_length))

new_tensor = torch.zeros(size=(int(np.floor(original_tensor.shape[0]*(3/2))),))
new_tensor[0::3] = original_tensor[0::2]
new_tensor[1::3] = original_tensor[1::2]

print(original_tensor)
print(new_tensor)

输出量:

tensor([0, 1, 2, 3, 4, 5])
tensor([0., 1., 0., 2., 3., 0., 4., 5., 0.])
1qczuiv0

1qczuiv02#

是的,您可以使用类似于this post的拼接技巧。让A是一个长度为a的Tensor(在你的例子中是a =384)。假设你想每n个元素添加一个新元素(在你的例子中是n = 2)。首先,我们将列表重新塑造成一个2D数组,列数为n:A = torch.兰德(384)#例如

a = A.shape[0]                 # 384
n = 2
insert_value = 10              # for example
A.shape                        #  shape is [384]

A = A.reshape(n-1,-1)          # shape is [192,2]
new = np.zeros([A.shape[0],1]) # shape is [192,1]
new += insert_value            # shape is [192,1]
B = torch.cat((A,new),dim = 1) # shape is [192,3]

这是唯一一个逻辑上重要的部分。如果我们将B看作一维的Tensor/列表,pytorch会先沿着第0个维度,然后是第1个维度,依此类推。这意味着对于一个3D数组,我们最终会得到一个列的行的列表,而对于一个2D数组(正如我们所做的那样),我们最终会得到一个行的列表。这给了我们想要的顺序。

result = B.reshape(-1) # shape is [576]

print(result)

>>> [rand,rand,10,rand,rand,10,rand,rand,10,...]

如果你想在A的现有元素之间添加多个元素,你可以将new的形状改为[a,num_elem],其中num_elem是你想插入的元素数量。

相关问题