PyTorch에서 행마다 다른 열 인덱스 선택/마스킹하기
PyTorch에서 행마다 다른 열 인덱스 선택/마스킹하기
해결책: 다음은 PyTorch에서 행마다 다른 열 인덱스를 선택하거나 마스킹하는 몇 가지 방법입니다.
torch.gather 사용:
import torch
# 텐서 생성
x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 선택할 열 인덱스 텐서 생성
row_indices = torch.tensor([1, 0, 2])
column_indices = torch.tensor([2, 0, 1])
# 행마다 다른 열 인덱스 선택
selected_values = torch.gather(x, 1, column_indices.unsqueeze(1).expand(x.size()))
print(selected_values) # tensor([3, 4, 9])
torch.index_select 사용:
# 행 인덱스 텐서 생성
row_indices = torch.tensor([0, 1, 2])
# 선택할 열 인덱스 리스트 생성
column_indices_list = [[2], [0], [1]]
# 행마다 다른 열 인덱스 선택
selected_values = torch.index_select(x, 0, row_indices).index_select(1, torch.tensor(column_indices_list))
print(selected_values) # tensor([3, 4, 9])
for 루프 사용:
# 행마다 다른 열 인덱스 선택
selected_values = []
for i, row_index in enumerate(row_indices):
selected_values.append(x[row_index, column_indices[i]])
print(selected_values) # [3, 4, 9]
마스킹:
# 마스크 텐서 생성
mask = torch.zeros(x.size(), dtype=torch.bool)
mask[row_indices, column_indices] = True
# 행마다 다른 열 인덱스 마스킹
masked_values = x.masked_fill(mask, 0)
print(masked_values) # tensor([[1, 0, 3], [0, 5, 0], [0, 0, 9]])
# 선택할 열 값 텐서 생성
column_values = torch.tensor([[3, 2, 1], [6, 5, 4], [9, 8, 7]])
# 행마다 다른 열 인덱스 선택
selected_values = torch.where(mask, column_values, x)
print(selected_values) # tensor([[1, 0, 3], [0, 5, 0], [0, 0, 9]])
참고:
- 위 코드는 PyTorch 1.9 버전 기준입니다.
- 사용하는 방법은 상황에 따라 선택하십시오.
PyTorch에서 행마다 다른 열 인덱스 선택/마스킹하기
import torch
# 텐서 생성
x = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 선택할 열 인덱스 텐서 생성
row_indices = torch.tensor([1, 0, 2])
column_indices = torch.tensor([2, 0, 1])
# **1. `torch.gather` 사용:**
selected_values = torch.gather(x, 1, column_indices.unsqueeze(1).expand(x.size()))
print(selected_values) # tensor([3, 4, 9])
# **2. `torch.index_select` 사용:**
selected_values = torch.index_select(x, 0, row_indices).index_select(1, torch.tensor(column_indices_list))
print(selected_values) # tensor([3, 4, 9])
# **3. for 루프 사용:**
selected_values = []
for i, row_index in enumerate(row_indices):
selected_values.append(x[row_index, column_indices[i]])
print(selected_values) # [3, 4, 9]
# **4. 마스킹:**
mask = torch.zeros(x.size(), dtype=torch.bool)
mask[row_indices, column_indices] = True
masked_values = x.masked_fill(mask, 0)
print(masked_values) # tensor([[1, 0, 3], [0, 5, 0], [0, 0, 9]])
# **5. `torch.where` 사용:**
column_values = torch.tensor([[3, 2, 1], [6, 5, 4], [9, 8, 7]])
selected_values = torch.where(mask, column_values, x)
print(selected_values) # tensor([[1, 0, 3], [0, 5, 0], [0, 0, 9]])
PyTorch에서 행마다 다른 열 인덱스 선택/마스킹하기 - 대체 방법
# 선택할 열 인덱스 텐서 생성
row_indices = torch.tensor([1, 0, 2])
column_indices = torch.tensor([2, 0, 1])
# 행마다 다른 열 인덱스 선택
selected_values = torch.take(x, row_indices, dim=0)[column_indices]
print(selected_values) # tensor([3, 4, 9])
NumPy 배열 사용:
import numpy as np
# 선택할 열 인덱스 리스트 생성
column_indices_list = [[2], [0], [1]]
# 행마다 다른 열 인덱스 선택
selected_values = [x[row_index, column_indices] for row_index, column_indices in zip(row_indices, column_indices_list)]
print(selected_values) # [3, 4, 9]
Pandas DataFrame 사용:
import pandas as pd
# Pandas DataFrame으로 변환
df = pd.DataFrame(x)
# 행마다 다른 열 인덱스 선택
selected_values = [df.iloc[row_index, column_index] for row_index, column_index in zip(row_indices, column_indices)]
print(selected_values) # [3, 4, 9]
pytorch