NumPy에서 빈 배열 / 행렬을 만들려면 어떻게해야합니까?


311

일반적으로 목록을 사용하는 방식으로 배열이나 행렬을 사용하는 방법을 알 수 없습니다. 빈 배열 (또는 행렬)을 만들고 한 번에 하나의 열 (또는 행)을 추가하고 싶습니다.

현재이 작업을 수행 할 수있는 유일한 방법은 다음과 같습니다.

mat = None
for col in columns:
    if mat is None:
        mat = col
    else:
        mat = hstack((mat, col))

그것이 목록이라면, 나는 다음과 같이 할 것입니다 :

list = []
for item in data:
    list.append(item)

NumPy 배열이나 행렬에 이런 종류의 표기법을 사용하는 방법이 있습니까?

답변:


441

NumPy를 효율적으로 사용하기위한 잘못된 정신 모델이 있습니다. NumPy 배열은 인접한 메모리 블록에 저장됩니다. 기존 배열에 행이나 열을 추가하려면 전체 배열을 새 메모리 블록에 복사하여 새 요소를 저장할 간격을 만들어야합니다. 배열을 만들기 위해 반복적으로 수행하면 매우 비효율적입니다.

행을 추가하는 경우 가장 좋은 방법은 데이터 집합의 크기보다 큰 배열을 만든 다음 행마다 데이터를 추가하는 것입니다.

>>> import numpy
>>> a = numpy.zeros(shape=(5,2))
>>> a
array([[ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])
>>> a[0] = [1,2]
>>> a[1] = [2,3]
>>> a
array([[ 1.,  2.],
   [ 2.,  3.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])

123
배열을 0으로 만들 필요가 없으면 numpy.empty ()도 있습니다.
janneb

21
zeros ()보다 empty ()를 사용하면 어떤 이점이 있습니까?
Zach

45
데이터를 즉시 초기화하면 데이터를 제로화하는 비용을 절감 할 수 있습니다.
marcorossi

16
@maracorossi .empty()는 셀에서 임의의 값을 찾을 수 있음을 의미하지만 배열은 .zeros()?
user3085931

6
트윗 담아 가기
Nathan

98

NumPy 배열은 목록과 매우 다른 데이터 구조이며 다른 방식으로 사용되도록 설계되었습니다. 당신의 사용 hstack은 잠재적으로 매우 비효율적입니다 ... 당신이 그것을 호출 할 때마다 기존 배열의 모든 데이터가 새로운 것으로 복사됩니다. ( append함수도 같은 문제가 있습니다.) 한 번에 한 열씩 행렬을 만들려면 끝날 때까지 목록에 보관하고 배열로 변환하는 것이 가장 좋습니다.

예 :


mylist = []
for item in data:
    mylist.append(item)
mat = numpy.array(mylist)

item각각 item이 동일한 수의 요소를 갖는 한 , 목록, 배열 또는 반복 가능한 것일 수 있습니다 .
이 특별한 경우 ( data매트릭스 열을 보유하는 일부 반복 가능) 간단히 사용할 수 있습니다.


mat = numpy.array(data)

또한 list변수 이름으로 사용 하면 내장 유형을 해당 이름으로 가려서 버그가 발생할 수 있으므로 권장하지 않습니다.

편집하다:

어떤 이유로 빈 배열을 만들고 싶다면을 사용할 수 numpy.array([])있지만 거의 유용하지 않습니다!


1
numpy 배열 / 행렬이 Matlab과 근본적으로 다른가요?
levesque

1
어떤 이유로 빈 배열을 정의해야하지만 너비가 고정 된 (예 :) np.concatenate()경우 다음을 사용할 수 있습니다 np.empty((0, some_width)). 0이므로 첫 번째 배열은 가비지 않습니다.
NumesSanguis

56

NumPy에서 빈 다차원 배열을 만들려면 (예 : m*n행렬을 저장 하는 2D 배열 ) m추가 할 행 수를 모르고 Stephen Simmons가 언급 한 계산 비용에 신경 쓰지 않는 경우 (즉, 추가 할 때마다 배열)에서 추가 할 차원을 0으로 짜낼 수 있습니다 X = np.empty(shape=[0, n]).

이 방법으로 예를 들어 사용할 수 있습니다 (여기서는 m = 5빈 행렬을 만들 때 알지 못한다고 가정합니다 n = 2).

import numpy as np

n = 2
X = np.empty(shape=[0, n])

for i in range(5):
    for j  in range(2):
        X = np.append(X, [[i, j]], axis=0)

print X

그것은 당신에게 줄 것입니다 :

[[ 0.  0.]
 [ 0.  1.]
 [ 1.  0.]
 [ 1.  1.]
 [ 2.  0.]
 [ 2.  1.]
 [ 3.  0.]
 [ 3.  1.]
 [ 4.  0.]
 [ 4.  1.]]

1
이것은 당신이 사전에 #rows을 알고, 0 행이있는 경우를 처리하지 않을 사용 사례에 대해 묻는 질문 OP에 대한 답해야한다
Spcogg 두 번째

26

학교 프로젝트 중 하나에서 numpy.array를 세트로 사용해야하고 비어 초기화해야했기 때문에 이것을 많이 조사했습니다 ... 스택 오버플로에서 관련 답변을 찾지 못했습니다. 뭔가를 낙서.

# Initialize your variable as an empty list first
In [32]: x=[]
# and now cast it as a numpy ndarray
In [33]: x=np.array(x)

결과는 다음과 같습니다.

In [34]: x
Out[34]: array([], dtype=float64)

따라서 다음과 같이 np 배열을 직접 초기화 할 수 있습니다.

In [36]: x= np.array([], dtype=np.float64)

이게 도움이 되길 바란다.


질문에서와 같이 배열에서는 작동하지 않지만 벡터에는 유용 ​​할 수 있습니다.
divenex

a=np.array([])기본값으로float64
P i

7

추가 기능을 사용할 수 있습니다. 행의 경우 :

>>> from numpy import *
>>> a = array([10,20,30])
>>> append(a, [[1,2,3]], axis=0)
array([[10, 20, 30],      
       [1, 2, 3]])

열의 경우 :

>>> append(a, [[15],[15]], axis=1)
array([[10, 20, 30, 15],      
       [1, 2, 3, 15]])

편집
물론, 다른 답변에서 언급했듯이 행렬 / 배열에서 처리 (예 : 반전)를 수행하지 않는 한 무언가를 추가 할 때마다 목록을 만들고 추가 한 다음 정렬.


3

배열의 최종 크기를 모르는 경우 다음과 같이 배열의 크기를 늘릴 수 있습니다.

my_arr = numpy.zeros((0,5))
for i in range(3):
    my_arr=numpy.concatenate( ( my_arr, numpy.ones((1,5)) ) )
print(my_arr)

[[ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]]
  • 을주의 0첫 번째 줄에.
  • numpy.append또 다른 옵션입니다. 호출합니다 numpy.concatenate.

3

0과 같은 모든 종류의 배열을 빌드하는 데 적용 할 수 있습니다.

a = range(5)
a = [i*0 for i in a]
print a 
[0, 0, 0, 0, 0]

4
순수 파이썬에서 그렇게하고 싶다면 a= [0] * 5간단한 해결책입니다
Makers_F

3

다음은 numpy를 Lists처럼 보이게 만드는 몇 가지 해결 방법입니다.

np_arr = np.array([])
np_arr = np.append(np_arr , 2)
np_arr = np.append(np_arr , 24)
print(np_arr)

출력 : 배열 ([2., 24.])


2

이것을 사용하는 것에 따라 데이터 유형을 지정해야 할 수도 있습니다 ( 'dtype' 참조 ).

예를 들어, 8 비트 값의 2D 배열을 만들려면 (흑백 이미지로 사용하기에 적합) :

myarray = numpy.empty(shape=(H,W),dtype='u1')

RGB 이미지의 경우 모양에 색상 채널 수를 포함하십시오. shape=(H,W,3)

numpy.zeros를 사용 하는 대신 0으로 초기화하는 것을 고려할 수도 있습니다 numpy.empty. 여기서 참고 사항을 참조 하십시오 .


1

목록으로 대부분의 작업을 처리하고 결과를 행렬로 사용하고 싶다고 생각합니다. 어쩌면 이것은 방법입니다;

ur_list = []
for col in columns:
    ur_list.append(list(col))

mat = np.matrix(ur_list)

1

빈 numpy 배열을 다음과 같이 만들 수 있다고 생각합니다.

>>> import numpy as np
>>> empty_array= np.zeros(0)
>>> empty_array
array([], dtype=float64)
>>> empty_array.shape
(0,)

이 형식은 루프에서 numpy 배열을 추가 할 때 유용합니다.


0

모양을 정의하지 않고 빈 NumPy 배열을 만들려면 다음과 같은 방법이 있습니다.

1.

arr = np.array([]) 

선호합니다. 당신이 이것을 numpy로 사용할 것이라는 것을 알기 때문입니다.

2.

arr = []
# and use it as numpy. append to it or etc..

NumPy는 이후에 extra없이 np.ndarray 유형으로 변환합니다 [] dimionsion.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.