numpy 배열을 초기화


129

모양의 numpy 배열을 초기화하고 추가하는 방법이 있습니까? 리스트 예제로 필요한 것을 설명하겠습니다. 루프에서 생성 된 객체 목록을 만들려면 다음을 수행하십시오.

a = []
for i in range(5):
    a.append(i)

numpy 배열과 비슷한 것을하고 싶습니다. vstack, concatenate 등에 대해 알고 있지만 입력으로 두 개의 numpy 배열이 필요한 것 같습니다. 내가 필요한 것은 :

big_array # Initially empty. This is where I don't know what to specify
for i in range(5):
    array i of shape = (2,4) created.
    add to big_array

big_array모양 이 있어야합니다 (10,4). 이것을하는 방법?


편집하다:

다음 설명을 추가하고 싶습니다. 나는 big_array = numpy.zeros((10,4))그것을 정의 하고 채울 수 있다는 것을 알고 있습니다 . 그러나 big_array의 크기를 미리 지정해야합니다. 이 경우 크기를 알고 있지만, 그렇지 않으면 어떻게합니까? .append파이썬에서 목록을 확장 하는 함수를 사용할 때 최종 크기를 미리 알 필요는 없습니다. 빈 배열로 시작하여 작은 배열에서 더 큰 배열을 만들 때 비슷한 것이 있는지 궁금합니다.


우연히 첫 번째 코드 샘플은 목록 이해력으로 깔끔하고 간결하게 작성 될 수 있습니다 [i for i in range(5)]. (동등하게 : list(range(5))이것은 고안된 예이지만)
Katriel

어떤 솔루션이 효과가 있었습니까? 나는 x = numpy.array()우리가 같은 목록 을 만드는 것과 비슷한 일을하려고합니다 y = []. 그러나 그것은 작동하지 않았다
kRazzy R

답변:


160

numpy.zeros

0으로 채워진 지정된 모양과 유형의 새 배열을 반환합니다.

또는

numpy.ones

주어진 모양과 유형으로 채워진 새로운 배열을 반환합니다.

또는

numpy.empty

항목을 초기화하지 않고 지정된 모양과 유형의 새 배열을 반환합니다.


그러나 요소를 목록에 추가하여 배열을 구성하는 방식은 numpy에서 많이 사용되지 않습니다. 대신 필요한 크기로 배열을 미리 할당 한 다음 행을 채워야합니다. numpy.append그래도 필요한 경우 사용할 수 있습니다 .


2
big_array = numpy.zeros를 설정 한 다음 생성 된 작은 배열로 채울 수 있음을 알고 있습니다. 그러나이를 위해서는 big_array의 크기를 미리 지정해야합니다. 미리 크기를 지정하지 않은 list 함수의 .append와 같은 것이 있습니까? 감사!
Curious2learn

2
@ Curious2learn. 아니요, Numpy에는 append와 비슷한 것이 없습니다. 배열을 연결하거나 새 배열을 만들어서 배열하는 기능이 있지만 추가하여 그렇게하지는 않습니다. 이는 데이터 구조가 설정되는 방식 때문입니다. Numpy array는 값을보다 콤팩트하게 저장할 수 있기 때문에 더 빠르지 만이 속도를 얻으려면 고정 된 크기 여야합니다. 파이썬리스트는 속도와 크기에 따라 더 유연하도록 설계되었습니다.
저스틴 필

3
@ 호기심 : 글쎄, 숫자가 append있습니다. 사전 할당하지 않는 것이 효율적이지 않다는 것 (이 경우에는 append매번 전체 배열을 복사하기 때문에 훨씬 덜 효율적 임)이므로 표준 기술이 아닙니다.
Katriel

1
np.empty배열의 일부만 값으로 채워지면 어떻게됩니까? 남은 "빈"항목은 어떻습니까?
Lee

1
너비 만 알고 있으면 (예 :에 필요 np.concatenate()) 다음을 사용하여 초기화 할 수 있습니다 np.empty((0, some_width)). 0이므로 첫 번째 배열은 가비지 않습니다.
NumesSanguis

40

내가 일반적으로하는 방법은 일반 목록을 만든 다음 내 물건을 추가하고 다음과 같이 목록을 numpy 배열로 변환하는 것입니다.

import numpy as np
big_array = [] #  empty regular list
for i in range(5):
    arr = i*np.ones((2,4)) # for instance
    big_array.append(arr)
big_np_array = np.array(big_array)  # transformed to a numpy array

물론 최종 객체는 생성 단계에서 메모리 공간의 두 배를 차지하지만 파이썬 목록에 추가하는 것은 매우 빠르며 np.array ()를 사용하여 생성하는 것도 가능합니다.


11
그러나 배열의 크기를 미리 알고 있다면 갈 수있는 방법이 아닙니다 ...하지만 배열의 크기가 얼마나 큰지 알지 못하면이 방법을 자주 사용합니다. 예를 들어 파일이나 다른 프로세스에서 데이터를 읽을 때. 파이썬과 numpy가 꽤 영리하기 때문에 처음에 보일 수있는 것처럼 실제로 끔찍하지는 않습니다.
travc

18

numpy 1.8에 도입 :

numpy.full

fill_value로 채워진 지정된 모양과 유형의 새 배열을 반환합니다.

예 :

>>> import numpy as np
>>> np.full((2, 2), np.inf)
array([[ inf,  inf],
       [ inf,  inf]])
>>> np.full((2, 2), 10)
array([[10, 10],
       [10, 10]])

13

파이썬의 배열 아날로그

a = []
for i in range(5):
    a.append(i)

입니다 :

import numpy as np

a = np.empty((0))
for i in range(5):
    a = np.append(a, i)

5
@NicholasTJ : empty((0))numpy 배열을 초기화합니다.
Adobe

2
np.empty ((0))의 대괄호는 중복됩니다.
Szymon Roziewski

7

numpy.fromiter() 당신이 찾고있는 것입니다 :

big_array = numpy.fromiter(xrange(5), dtype="int")

또한 다음과 같은 생성기 표현식에서도 작동합니다.

big_array = numpy.fromiter( (i*(i+1)/2 for i in xrange(5)), dtype="int" )

미리 배열의 길이를 알고 있다면 선택적인 'count'인수로 지정할 수 있습니다.


2
실제로 timeit을 실행했으며 np.fromiter ()가 np.array ()보다 느릴 수 있다고 생각합니다. timeit ( "np.array (i in xrange (100))", setup = "numpy를 np로 가져 오기", 숫자 = 10000)-> 0.02539992332458496, timeit ( "np.fromiter ((irange in i xrange ( 100)), dtype = int) ", setup ="numpy를 np로 가져 오기 ", 숫자 = 10000)-> 0.13351011276245117
hlin117

6

어레이 컴퓨팅을 수행 할 때 가능한 한 명시적인 루프를 피하고 싶기 때문에 해당 컴퓨팅 형식의 속도 이득이 줄어 듭니다. numpy 배열을 초기화하는 방법에는 여러 가지가 있습니다. 0으로 채워지려면 katrielalex가 말한 것처럼하십시오.

big_array = numpy.zeros((10,4))

편집 : 어떤 종류의 시퀀스를 만들고 있습니까? numpy.linspace(start, stop, size)( 같은 간격의 숫자) 또는와 같은 배열을 만드는 다른 numpy 함수를 확인해야합니다 numpy.arange(start, stop, inc). 가능한 경우 이러한 함수는 명시 적 루프에서 동일한 작업을 수행하는 것보다 훨씬 빠른 속도로 배열을 만듭니다.


5

첫 번째 배열 예를 사용하려면

a = numpy.arange(5)

big_array를 초기화하려면 다음을 사용하십시오.

big_array = numpy.zeros((10,4))

이것은 0으로 초기화한다고 가정합니다. 이것은 꽤 일반적이지만 numpy에서 배열을 초기화하는 다른 많은 방법이 있습니다 .

편집 : 미리 big_array의 크기를 모르는 경우 일반적으로 append를 사용하여 Python 목록을 작성하는 것이 가장 좋으며 목록에 모든 항목이 수집되면을 사용 하여이 목록을 numpy 배열로 변환하십시오 numpy.array(mylist). 그 이유는 목록이 매우 효율적이고 빠르게 성장하는 반면 numpy.concatenate는 numpy 배열의 크기가 쉽게 변경되지 않기 때문에 매우 비효율적입니다. 그러나 모든 것이 목록에 수집되고 최종 배열 크기를 알면 numpy 배열을 효율적으로 만들 수 있습니다.


5

특정 행렬로 numpy 배열을 초기화하려면

import numpy as np

mat = np.array([[1, 1, 0, 0, 0],
                [0, 1, 0, 0, 1],
                [1, 0, 0, 1, 1],
                [0, 0, 0, 0, 0],
                [1, 0, 1, 0, 1]])

print mat.shape
print mat

산출:

(5, 5)
[[1 1 0 0 0]
 [0 1 0 0 1]
 [1 0 0 1 1]
 [0 0 0 0 0]
 [1 0 1 0 1]]

3

다음과 같은 상황에 처할 때마다

a = []
for i in range(5):
    a.append(i)

그리고 당신은 numpy와 비슷한 것을 원하지만, 이전의 몇 가지 대답은 그것을 수행하는 방법을 지적했지만 @katrielalex가 지적했듯이 이러한 방법은 효율적이지 않습니다. 이를 수행하는 효율적인 방법은 긴 목록을 작성한 다음 긴 목록을 작성한 후 원하는 방식으로 재구성하는 것입니다. 예를 들어, 파일에서 일부 행을 읽고 있고 각 행에 숫자 목록이 있고 여러 개의 모양 배열 (읽은 행 수, 각 행의 벡터 길이)을 만들고 싶다고 가정 해 봅시다. 더 효율적으로 수행하는 방법은 다음과 같습니다.

long_list = []
counter = 0
with open('filename', 'r') as f:
    for row in f:
        row_list = row.split()
        long_list.extend(row_list)
        counter++
#  now we have a long list and we are ready to reshape
result = np.array(long_list).reshape(counter, len(row_list)) #  desired numpy array

2

나는 이것이 조금 늦었다는 것을 알고 있지만 빈 배열에 대한 색인 작성에 대한 다른 대답은 보지 못했습니다.

big_array = numpy.empty(10, 4)
for i in range(5):
    array_i = numpy.random.random(2, 4)
    big_array[2 * i:2 * (i + 1), :] = array_i

이렇게하면 numpy.empty인덱스 할당을 사용할 때 전체 결과 배열을 미리 할당 하고 행을 채 웁니다.

전체 배열이 생성 한 청크로 채워질 것이므로 보장 한 예제 empty대신 사전 할당하는 것이 안전합니다 zeros.


2

먼저 모양을 정의하는 것이 좋습니다. 그런 다음 반복하여 값을 삽입하십시오.

big_array= np.zeros(shape = ( 6, 2 ))
for it in range(6):
    big_array[it] = (it,it) # For example

>>>big_array

array([[ 0.,  0.],
       [ 1.,  1.],
       [ 2.,  2.],
       [ 3.,  3.],
       [ 4.,  4.],
       [ 5.,  5.]])

1

아마도 이런 것이 당신의 요구에 맞을 것입니다 ..

import numpy as np

N = 5
res = []

for i in range(N):
    res.append(np.cumsum(np.ones(shape=(2,4))))

res = np.array(res).reshape((10, 4))
print(res)

다음과 같은 출력을 생성합니다

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