반응형
python 보고서ValueError: could not broadcast input array from shape
numpy valueError: could not broadcast input array from shape 입니다.
tensorflow 보고 ValueError: Can't convert non-rectangular Python sequence to Tensor.
이 두 가지 오류는 모두 동일한 원인입니다
numpy 및 tensorflow를 사용하여 list를 array 또는 tensor로 변환할 때 오류를 보고합니다.
잘못된 코드가 뜹니다:
a = np.array([[1.1,1.2],[2.1,2.2]])
b = np.array([[1.1,1.2,1.3],[2.1,2.2,2.3]])
c = [a,b]
d = np.array(c)
# d = tf.constant(c)
오류 메시지 설명입니다
ValueError: could not broadcast input array from shape (2,2) into shape (2)
# ValueError: Can't convert non-rectangular Python sequence to Tensor.
문제 분석입니다
이 문제가 발생하는 주요 원인은 list에서 array의 shape가 일치하지 않기 때문에 이 문제가 발생할 경우 list에서 배열의 shape를 모두 출력하여 관찰해 봅니다
print(a.shape,b.shape)
정보를 출력합니다
(2, 2) (2, 3)
문제를 해결하다.
이 문제에 대한 세 가지 주요 해결 방법이 있는데 첫 번째는 사전을 사용하는 것으로 변경하는 것입니다.두번째는 list에 있는 array를 모두 전개하는 것이고, 세번째는 mask를 이용하여 배열의 shape를 일치시키는 것입니다.
첫 번째는 사전을 사용하는 것으로 바꿉니다
각 목록을 사전으로 구분하여 저장하고, 각 목록을 tensorflow나 numpy의 데이터 형식으로 변환할 수 있습니다.
만약 나중에 변수 c를 조작한다면, 이 방식을 추천합니다
a = np.array([[1.1,1.2],[2.1,2.2]])
b = np.array([[1.1,1.2,1.3],[2.1,2.2,2.3]])
c = {'a':tf.constant(a),'b':tf.constant(b)}
print(c)
{'a': <tf.Tensor: id=0, shape=(2, 2), dtype=float64, numpy=
array([[1.1, 1.2],
[2.1, 2.2]])>, 'b': <tf.Tensor: id=1, shape=(2, 3), dtype=float64, numpy=
array([[1.1, 1.2, 1.3],
[2.1, 2.2, 2.3]])>}
사용할 때는 사전 사용만 누르면 됩니다.
배열을 펼칩니다
이 방법을 사용할 때는 배열의 행이나 열을 일치시켜야 하는데, 하나의 차원이 다를 수밖에 없고, 그렇지 않으면 배열이 환원될 수 없습니다
a = np.array([[1.1,1.2],[2.1,2.2]])
b = np.array([[1.1,1.2,1.3],[2.1,2.2,2.3]])
c = np.array([a.ravel(),b.ravel()])
print(c)
for arr in c:
print(arr.reshape(2,-1) # 모양을 바꿉니다
정보를 출력합니다
[array([1.1, 1.2, 2.1, 2.2]) array([1.1, 1.2, 1.3, 2.1, 2.2, 2.3])]
[[1.1 1.2]
[2.1 2.2]]
[[1.1 1.2 1.3]
[2.1 2.2 2.3]]
mask를 이용합니다.
이 방법은 주로 사진에 적용하는데, 보통 사진의 최대 크기를 템플릿으로 사용합니다. 물론 사진이라면 resize를 통해서도 shape를 일치시킬 수 있습니다. 다만 resize를 사용하면 사진이 변형되어 사진 표현에 영향을 줄 수 있습니다
import copy
a = np.array([[1.1,1.2],[2.1,2.2]])
b = np.array([[1.1,1.2,1.3],[2.1,2.2,2.3]])
mask = np.zeros((2,3))
a_mask = copy.deepcopy(mask)
a_mask[:a.shape[0],:a.shape[1]] = a
b_mask = copy.deepcopy(mask)
b_mask[:b.shape[0],:b.shape[1]] = b
c = np.array([a_mask,b_mask])
print(c)
정보를 출력합니다
[[[1.1 1.2 0. ]
[2.1 2.2 0. ]]
[[1.1 1.2 1.3]
[2.1 2.2 2.3]]]
반응형
'개발 꿀팁 > PYTHON' 카테고리의 다른 글
파이썬넘바 라이브러리 (0) | 2022.12.06 |
---|---|
python-imutils 패키지 프로필 사용 (0) | 2022.12.06 |
python 현재 실행 중인 스레드 이름과 개수를 가져옵니다. threading.enumerate( ) (0) | 2022.12.06 |
python flask send_file 파일을 업로드하고 jquery.js를 통해 다운로드합니다 (0) | 2022.12.06 |
vscode를 사용하여 Python 프로그램을 만들고 실행합니다 (0) | 2022.12.03 |