論理インデックスまたはインデックスのリストを使用してテンソルをスライスできますか? 質問する

論理インデックスまたはインデックスのリストを使用してテンソルをスライスできますか? 質問する

列の論理インデックスを使用して 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

おすすめ記事