본문 바로가기
Python

리스트 안에 numpy array나 Tensor 배열이 갇혀 있을 때 해결방법.

by 187cm 2023. 3. 28.
반응형

 

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

 

반응형