Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python AttributeError: 'numpy.ndarray' 객체에 'append' 속성이 없습니다 — 원인과 해결 방법

일반 파이썬에서는 append() 메서드를 사용해 리스트 끝에 항목을 추가할 수 있습니다. 하지만 NumPy에서는 이 메서드를 사용할 수 없습니다. 파이썬의 append() 메서드로 NumPy 배열 끝에 항목을 추가하려고 하면 AttributeError: 'numpy.ndarray' object has no attribute 'append' 오류가 발생합니다.

이 글에서는 해당 NumPy 오류의 원인과 해결 방법을 예제와 함께 자세히 살펴보겠습니다.

AttributeError: 'numpy.ndarray' object has no attribute 'append'란?

이 오류는 일반 파이썬의 append() 메서드를 사용해 NumPy 배열에 항목을 추가하려고 할 때 발생합니다. 배열에 항목을 추가하려면 대신 NumPy 전용 메서드인 numpy.append()를 사용해야 합니다.

numpy.append()는 NumPy 라이브러리를 위해 별도로 작성된 메서드입니다. NumPy 배열은 일반 파이썬 리스트와 구조가 다르기 때문에, NumPy가 자체적인 배열 추가 메서드를 제공하는 것은 자연스러운 일입니다.

NumPy의 append() 메서드는 다음과 같은 문법을 사용합니다.

numpy.append(배열_객체, 추가할_항목)

각 인자의 의미는 다음과 같습니다.

  • 배열_객체: 항목을 추가할 대상 NumPy 배열
  • 추가할_항목: 해당 배열 끝에 추가하고자 하는 값

numpy.append() 메서드는 지정한 배열을 기반으로, 새 항목이 맨 끝에 포함된 새로운 배열을 반환합니다. 일반 파이썬에서처럼 배열 객체 뒤에 .append()를 붙여 호출하는 방식이 아니라는 점에 유의하세요.

그럼 실제 예시를 통해 이 오류가 어떻게 발생하는지 살펴보겠습니다.

오류 발생 예시

공장에서 품질 검사를 통과한 제품의 점수를 추적하는 애플리케이션을 개발한다고 가정해 보겠습니다. 제품은 50점 만점으로 평가되며, 최소 40점 이상을 받아야 출고될 수 있습니다.

우리가 구현할 기능은 지난 하루 동안 제품이 받은 점수를 저장하는 배열에 새 점수를 추가하는 것입니다. 이 코드는 다음과 같이 작성할 수 있습니다.

import numpy as np

scores = np.array([49, 48, 49, 47, 42, 48, 46, 50])
to_add = 49

scores.append(to_add)

print(scores)

위 프로그램은 점수 배열에 새로운 점수 49를 추가합니다. 실제 환경에서는 파일에서 점수를 읽어오겠지만, 예시를 단순하게 유지하기 위해 코드 내에서 직접 배열을 선언했습니다. 정상적으로 실행된다면 새 점수가 추가된 후 전체 점수 목록이 콘솔에 출력될 것입니다.

코드를 실행하면 어떻게 될까요?

Traceback (most recent call last):
  File "test.py", line 6, in <module>
	scores.append(to_add)
AttributeError: 'numpy.ndarray' object has no attribute 'append'

코드에서 오류가 발생했습니다.

해결 방법

원인은 간단합니다. NumPy 전용 메서드가 아닌, 일반 파이썬의 append() 메서드로 NumPy 배열에 항목을 추가하려 했기 때문입니다.

이 오류를 해결하려면 numpy.append() 메서드의 문법에 맞게 코드를 수정해야 합니다.

import numpy as np

scores = np.array([49, 48, 49, 47, 42, 48, 46, 50])

scores = np.append(scores, 49)

print(scores)

여기서 np는 NumPy 라이브러리를 가리킵니다. import 문에서 numpy를 np로 정의했기 때문에 이렇게 사용할 수 있습니다. 첫 번째 인자에는 항목을 추가할 배열을, 두 번째 인자에는 배열에 추가할 새 점수를 전달합니다.

중요한 점은 np.append()의 결과를 반드시 변수에 다시 할당해야 한다는 것입니다. np.append()는 기존 배열을 수정(in-place)하지 않고, 새 값이 추가된 새로운 배열을 생성해 반환하기 때문입니다.

프로그램을 다시 실행해 보겠습니다.

[49 48 49 47 42 48 46 50 49]

숫자 49가 배열 끝에 성공적으로 추가되었습니다.

성능 팁: 반복 작업에서는 np.append() 사용을 피하세요

참고로, NumPy 배열은 크기가 고정되어 있어 np.append()를 호출할 때마다 새 배열을 생성합니다. 따라서 반복문 안에서 여러 항목을 하나씩 추가하면 성능이 크게 저하될 수 있습니다. 이 경우에는 일반 파이썬 리스트에 append()로 값을 모은 뒤, 마지막에 np.array()로 한 번에 변환하는 방식이 훨씬 효율적입니다.

마무리

AttributeError: 'numpy.ndarray' object has no attribute 'append' 오류는 일반 파이썬의 append() 메서드로 NumPy 배열에 항목을 추가하려 할 때 발생합니다. 대신 numpy.append(배열, 추가할_항목) 형태의 numpy.append() 메서드를 사용해야 하며, 이 메서드는 지정한 항목이 맨 끝에 추가된 새로운 배열을 반환한다는 점을 기억하세요.