기록하는 습관

[Numpy] (문제) #001. Reshape & Concat 본문

Python/Numpy

[Numpy] (문제) #001. Reshape & Concat

Avalla 2023. 8. 7. 16:06

Exercise

 

위와 같이 배열을 합치려고 한다.

두 배열이 아래와 같이 주어졌다고 하자.

import numpy as np
x = np.array([[1,2], [3,4]])
y = np.array([5,6])
print(x)
print( "shape :", x.shape, "ndim :", x.ndim )
print(y)
print( "shape :", y.shape, "ndim :", y.ndim )
[[1 2]
 [3 4]]
shape : (2, 2) ndim : 2
[5 6]
shape : (2,) ndim : 1

만약 배열 y가 아래와 같다면 바로 concat을 적용할 수 있다.

y_ = np.array([[5],[6]])
print( y_ )
print( "shape :", y_.shape, "ndim :", y_.ndim )
[[5]
 [6]]
shape : (2, 1) ndim : 2
np.concatenate([x,y_], axis=1)
array([[1, 2, 5],
       [3, 4, 6]])

그러나 주어진 y에 대해서는 concat을 바로 적용할 수 없다.

np.concatenate([x,y], axis=1)
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-8-8b9e81256274> in <module>
----> 1 np.concatenate([x,y], axis=1)


<__array_function__ internals> in concatenate(*args, **kwargs)


ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 2 dimension(s) and the array at index 1 has 1 dimension(s)

 

Solution

y의 shape이 문제인데, 다음과 같은 방법으로 reshape해서 해결 가능하다.

x
array([[1, 2],
       [3, 4]])
y_new = y.reshape(2,-1)
sol = np.concatenate( (x, y_new), axis=1 )
print( "기존 y ▶", y )
print( "shape :", y.shape, "ndim :", y.ndim , "\n")
print( "y.reshape(2,-1) reshape 결과 ▶\n", y.reshape(2,-1) )
print( "shape :", y_new.shape, "ndim :", y_new.ndim, "\n" )
print( "답 ▶\n", sol )
기존 y ▶ [5 6]
shape : (2,) ndim : 1 

y.reshape(2,-1) reshape 결과 ▶
 [[5]
 [6]]
shape : (2, 1) ndim : 2 

답 ▶
 [[1 2 5]
 [3 4 6]]

아래와 같은 방법으로 차원을 추가해서 풀 수 있다.

y_new = y[:, np.newaxis]
sol = np.concatenate( (x, y_new), axis=1 )
print( "기존 y ▶", y )
print( "shape :", y.shape, "ndim :", y.ndim , "\n")
print( "y[:, np.newaxis] 축 추가 결과 ▶\n", y[:, np.newaxis] )
print( "shape :", y_new.shape, "ndim :", y_new.ndim, "\n" )
print( "답 ▶\n", sol )
기존 y ▶ [5 6]
shape : (2,) ndim : 1 

y[:, np.newaxis] 축 추가 결과 ▶
 [[5]
 [6]]
shape : (2, 1) ndim : 2 

답 ▶
 [[1 2 5]
 [3 4 6]]

아래와 같이 앞쪽 차원을 추가한 후 Transpose해도 가능하다.

y_new = y[np.newaxis, :].T
sol = np.concatenate( (x, y_new), axis=1 )
print( "y[np.newaxis, :] 축 추가 결과 ▶", y[np.newaxis, :] )
print( "Transpose 결과 ▶\n", y[np.newaxis, :].T )
print( "shape :", y_new.shape, "ndim :", y_new.ndim )
print( "답 y[np.newaxis, :].T ▶\n", sol )
y[np.newaxis, :] 축 추가 결과 ▶ [[5 6]]
Transpose 결과 ▶
 [[5]
 [6]]
shape : (2, 1) ndim : 2
답 y[np.newaxis, :].T ▶
 [[1 2 5]
 [3 4 6]]