列の論理インデックスを使用してPyTorchテンソルをスライスしようとしています。インデックスベクトルの1つの値に対応する列が必要です。スライスと論理インデックスの両方が可能ですが、それらは一緒に可能ですか?もしそうなら、どうですか?私の試みは役に立たないエラーを投げ続けます
TypeError:ByteTensor型のオブジェクトでテンソルにインデックスを付けます。サポートされる唯一のタイプは、整数、スライス、numpyスカラー、および唯一の引数としてのtorch.LongTensorまたはtorch.ByteTensorです。
望ましい出力
C = torch.LongTensor([[1, 3], [4, 6]])
# 1 3
# 4 6
列のみの論理インデックス
import torch
A_log = torch.ByteTensor([1, 0, 1]) # the logical index
B = torch.LongTensor([[1, 2, 3], [4, 5, 6]])
C = B[:, A_log] # Throws error
インデックスのリストも使用してみました
import torch
A_idx = torch.LongTensor([0, 2]) # the index vector
B = torch.LongTensor([[1, 2, 3], [4, 5, 6]])
C = B[:, A_idx] # Throws error
ベクトルが同じサイズの場合、論理インデックスが機能します
import torch
A_log = torch.ByteTensor([1, 0, 1]) # the logical index
B = torch.LongTensor([1, 2, 3])
C = B[A_log]
インデックスの連続した範囲を使用すると、スライスは機能します
import torch
B = torch.LongTensor([[1, 2, 3], [4, 5, 6]])
C = B[:, 1:2]
論理インデックスを繰り返して、インデックスを付けるテンソルと同じサイズになるようにして、目的の結果を得ることができますが、出力を再形成する必要もあります。
import torch
A_log = torch.ByteTensor([1, 0, 1]) # the logical index
B = torch.LongTensor([[1, 2, 3], [4, 5, 6]])
C = B[A_log.repeat(2, 1)] # [torch.LongTensor of size 4]
C = C.resize_(2, 2)
これは index_select
関数、あなたは試すことができます
import torch
A_idx = torch.LongTensor([0, 2]) # the index vector
B = torch.LongTensor([[1, 2, 3], [4, 5, 6]])
C = B.index_select(1, A_idx)
# 1 3
# 4 6