web-dev-qa-db-ja.com

論理インデックスまたはインデックスのリストでテンソルをスライスできますか?

列の論理インデックスを使用してPyTorchテンソルをスライスしようとしています。インデックスベクトルの1つの値に対応する列が必要です。スライスと論理インデックスの両方が可能ですが、それらは一緒に可能ですか?もしそうなら、どうですか?私の試みは役に立たないエラーを投げ続けます

TypeError:ByteTensor型のオブジェクトでテンソルにインデックスを付けます。サポートされる唯一のタイプは、整数、スライス、numpyスカラー、および唯一の引数としてのtorch.LongTensorまたはtorch.ByteTensorです。

MCVE

望ましい出力

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)
9
Cecilia

これは 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
6
dontloo