列の論理インデックスを使用して PyTorch テンソルをスライスしようとしています。インデックス ベクトルの 1 の値に対応する列が必要です。スライスと論理インデックスはどちらも可能ですが、一緒に使用することはできますか? 可能であれば、どのようにすればよいですか? 私の試みは役に立たないエラーをスローし続けます
TypeError: ByteTensor 型のオブジェクトを使用してテンソルをインデックスしています。サポートされている型は、整数、スライス、numpy スカラー、および唯一の引数としての torch.LongTensor または torch.ByteTensor のみです。
MCVE
望ましい出力
import torch
C = torch.LongTensor([[1, 3], [4, 6]])
# 1 3
# 4 6
論理インデックス列のみ:
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
ベクトルのサイズが同じ場合、論理インデックスが機能します。
B_truncated = torch.LongTensor([1, 2, 3])
C = B_truncated[A_log]
また、論理インデックスを繰り返して、インデックス付けするテンソルと同じサイズにすることで、目的の結果を得ることができますが、その場合、出力の形状も変更する必要があります。
C = B[A_log.repeat(2, 1)] # [torch.LongTensor of size 4]
C = C.resize_(2, 2)
私も使ってみましたインデックスのリスト:
A_idx = torch.LongTensor([0, 2]) # the index vector
C = B[:, A_idx] # Throws error
連続した範囲のインデックスが必要な場合は、スライス作品:
C = B[:, 1:2]
ベストアンサー1
これは次のように実装されていると思います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