Python
리스트 안에 numpy array나 Tensor 배열이 갇혀 있을 때 해결방법.
187cm
2023. 3. 28. 10:40
반응형
Numpy array나 Tensor 형태의 배열이 list로 감싸져 있을 때 벗겨내는 방법
Unsupervised/Semi-Supervised Learning을 하기 위해 Training set을 재정의 한다던가, Custom Dataset을 만들었을 때 Training sample을 만들기 위해, 등등 여러가지 경우로 아래의 코드와 같이 리스트 안에 또 다른 배열, numpy array, tensor 등을 정의할 때가 생긴다. 이 때 이 배열에서 빼내는 방법에 대해서 알아보자.
MNIST 데이터 셋을 예시로 들었을 때 이미지의 크기는 (1, 28, 28) 정도가 된다. 하지만 시각화 하기 어렵기에, 임의로 정의한 np.ones((1, 4, 4)) 크기의 numpy array를 예시로 들어보자.
tensor_list = torch.Tensor(np.ones((100, 1, 4, 4)))
tensor_array_with_list = [tensor for tensor in tensor_list]
print(tensor_array_with_list)
위와 같은 크기의 numpy array를 tensor로 생성 후, 리스트에 집어 넣을 경우 다음과 같은 형태가 나오게 되며, 이 tensor를 빼내기 위해선 아래와 같은 작업을 하면 된다.
[tensor([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]]), tensor([[[1., 1., 1., 1.],
...
[1., 1., 1., 1.]]]), tensor([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])]
numpy나 tensor 형태로 변환하는데 어려움을 겪을 경우 아래와 같이 List compreshention에 출력 값에다가 .numpy() 혹은 np.array()를 덮어 씌워준 후 겉에도 np.array() 혹은 torch.Tensor()로 감싸주시면 된다.
np_array = np.array([tensor.numpy() for tensor in tensor_array_with_list])
np_array.shape, np_array # (100, 1, 4, 4)
출력 결과
((100, 1, 4, 4),
array([[[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]],
...,
[[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
...
[[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]]], dtype=float32))
반응형