NumPy 배열 초기화 (동일한 값으로 채움)


237

n각 요소의 길이가 NumPy 인 배열을 만들어야합니다 v.

다음보다 좋은 것이 있습니까?

a = empty(n)
for i in range(n):
    a[i] = v

나는 알고있다 zerosonesV = 0, 내가 사용할 수 있습니다 1. 작동합니다 v * ones(n),하지만 때 작업을하지 않습니다 v이며 None, 또한 훨씬 느린 것입니다.


1
내 컴퓨터에서 0의 경우 a = np.zeros(n)루프에서 사용 하는 것이보다 빠릅니다 a.fill(0). 이것은 a=np.zeros(n)새로운 메모리를 할당하고 초기화해야 한다고 생각했기 때문에 예상했던 것과 반대 입니다. 누구든지 이것을 설명 할 수 있다면 고맙겠습니다.
user3731622

셀은 특정 데이터 유형으로 작성되고 없음은 자체 유형이며 실제로 포인터이기 때문에 numpy 배열에는 None을 넣을 수 없습니다.
Camion

@Camion 그래, 나는 지금 알고있다 :) 물론 v * ones(n)비싼 곱셈을 사용하기 때문에 여전히 끔찍하다. 그래도 대체 *하고 어떤 경우에는 놀랍게도 좋은 것으로 판명되었습니다 ( stackoverflow.com/questions/5891410/… ). +v + zeros(n)
최대

v를 추가하기 전에 0으로 배열을 만드는 대신 max를 사용하여 비어있는 var = np.empty(n)다음 'var [:] = v'로 채우는 것이 더 빠릅니다 . (btw, np.full()이것만큼 빠름)
Camion

답변:


308

도입 NumPy와 1.8 np.full()보다 더 직접적인 방법으로, empty()다음에 fill()특정 값으로 충전 된 배열을 생성 :

>>> np.full((3, 5), 7)
array([[ 7.,  7.,  7.,  7.,  7.],
       [ 7.,  7.,  7.,  7.,  7.],
       [ 7.,  7.,  7.,  7.,  7.]])

>>> np.full((3, 5), 7, dtype=int)
array([[7, 7, 7, 7, 7],
       [7, 7, 7, 7, 7],
       [7, 7, 7, 7, 7]])

이것은 틀림없이 명시 적으로 실현되는 기능에 대해 설명 (및 매우 특정한 작업을 수행 이후 원칙적으로 매우 효과적 일 수있다) 때문에, 소정의 값으로 채워진 배열을 만드는 방법.


1
이 full () 메소드는 저에게 효과적이지만 약간의 문서를 찾을 수 없습니다. 누구든지 올바른 장소를 가리킬 수 있습니까?
James Adams

1
적어도 help(numpy.full)파이썬 쉘에서 할 수 있습니다 . 또한 웹 문서에없는 것이 놀랍습니다.
Eric O Lebigot

내 시스템 (Python 2.7, Numpy 1.8)에서 np.full ()은 실제로 np.empty ()보다 약간 느리고 np.fill ()입니다.
존 즈 빙크

1
10,000 요소 의 경우 약 10 %의 차이로 동일한 것을 관찰합니다 ( np.fill()존재하지 않고 있어야 함 제외 arr.fill()). 차이가 더 크면 NumPy 버그 추적기에서 문제가 발생합니다. :) 나는 실행 시간의 작은 차이로 인해보다 명확하고 명확한 코드를 선호하므로 np.full()항상 함께갑니다 .
에릭 오 레비 고트

내 컴퓨터에서 np.full ()은 np.array.fill ()과 동일한 속도입니다.
Fnord

92

Numpy 1.7.0 용으로 업데이트 : (@Rolf Bartstra에 대한 핫팁)

a=np.empty(n); a.fill(5) 가장 빠릅니다.

내림차순으로 :

%timeit a=np.empty(1e4); a.fill(5)
100000 loops, best of 3: 5.85 us per loop

%timeit a=np.empty(1e4); a[:]=5 
100000 loops, best of 3: 7.15 us per loop

%timeit a=np.ones(1e4)*5
10000 loops, best of 3: 22.9 us per loop

%timeit a=np.repeat(5,(1e4))
10000 loops, best of 3: 81.7 us per loop

%timeit a=np.tile(5,[1e4])
10000 loops, best of 3: 82.9 us per loop

13
보다 최신의 직접 타이밍을 추가하는 np.full()것이 유용합니다. 내 컴퓨터에서 NumPy 1.8.1을 사용하면 덜 직접적인 fill()버전 보다 약 15 % 느립니다 ( full()약간 더 빠를 가능성이 있기 때문에 예기치 않은 ).
Eric O Lebigot

@DavidSanders : 내가 당신을 따르고 있는지 확실하지 않습니다 : fill()가장 빠른 솔루션입니다. 곱셈 솔루션이 훨씬 느립니다.
Eric O Lebigot 2016 년

2
참고 : 속도가 실제로 문제가되는 경우 크기 10000대신에 크기를 사용 1e4하면 어떤 이유로 눈에 띄는 차이 full()가 생깁니다 ( 와 함께 거의 50 % 느림 1e4).
Eric O Lebigot 2016 년

로 내 결과를 추가 full()하면 데이터 유형이 명시 적으로 부동이 아닌 경우 상당히 느리게 실행됩니다. 그렇지 않으면 여기에 가장 좋은 방법과 비교할 수 있지만 약간 느립니다.
user2699

@ user2699 난 100000 개 요소와,이를 관찰하고 있지 않다 full(100000, 5), full(100000, 5, dtype=float), full(100000, 5, dtype=int)a =np.empty(100000); a.fill(5)(NO 캐싱 : 내 컴퓨터에서 동시에 관한 모든 테이크 %timeit -r1 -n1 …) (NumPy와 1.11.2).
Eric O Lebigot

65

fill가장 빠른 방법 이라고 생각 합니다.

a = np.empty(10)
a.fill(7)

또한 당신의 모범에서하고있는 것처럼 항상 반복하는 것을 피해야합니다. 간단한 a[:] = v것은 numpy 방송을 사용하여 반복 작업을 수행합니다 .


1
감사합니다. 를 보면 내 요구에 더 잘 맞는 fill것을 알 repeat수있었습니다.
최대

귀하의 추천 a[:]=v이 실제로 전체보다 더 빠르다고 답변을 업데이트 fill하시겠습니까?
최대

@max 더 빠릅니까? 방송은 배열을 채우는보다 일반적인 방법이며 매우 좁은 사용 사례와 같거나 느립니다 fill.
Paul

16

명백히, 절대 속도뿐만 아니라 속도 순서 (user1579844에 의해보고 된 바와 같이)는 기계에 의존적이다. 여기 내가 찾은 것이 있습니다 :

a=np.empty(1e4); a.fill(5) 가장 빠릅니다.

내림차순으로 :

timeit a=np.empty(1e4); a.fill(5) 
# 100000 loops, best of 3: 10.2 us per loop
timeit a=np.empty(1e4); a[:]=5
# 100000 loops, best of 3: 16.9 us per loop
timeit a=np.ones(1e4)*5
# 100000 loops, best of 3: 32.2 us per loop
timeit a=np.tile(5,[1e4])
# 10000 loops, best of 3: 90.9 us per loop
timeit a=np.repeat(5,(1e4))
# 10000 loops, best of 3: 98.3 us per loop
timeit a=np.array([5]*int(1e4))
# 1000 loops, best of 3: 1.69 ms per loop (slowest BY FAR!)

따라서 플랫폼에서 가장 빠른 것을 찾아서 사용하십시오.


14

나는했다

numpy.array(n * [value])

명심하지만, 그것은 분명히 다른 모든 제안보다 느리다. n .

다음은 perfplot (내 애완 동물 프로젝트) 과 완전히 비교 한 것입니다.

여기에 이미지 설명을 입력하십시오

두 가지 empty대안이 여전히 가장 빠릅니다 (NumPy 1.12.1 사용). full큰 배열을 따라 잡습니다.


플롯을 생성하는 코드 :

import numpy as np
import perfplot


def empty_fill(n):
    a = np.empty(n)
    a.fill(3.14)
    return a


def empty_colon(n):
    a = np.empty(n)
    a[:] = 3.14
    return a


def ones_times(n):
    return 3.14 * np.ones(n)


def repeat(n):
    return np.repeat(3.14, (n))


def tile(n):
    return np.repeat(3.14, [n])


def full(n):
    return np.full((n), 3.14)


def list_to_array(n):
    return np.array(n * [3.14])


perfplot.show(
    setup=lambda n: n,
    kernels=[empty_fill, empty_colon, ones_times, repeat, tile, full, list_to_array],
    n_range=[2 ** k for k in range(27)],
    xlabel="len(a)",
    logx=True,
    logy=True,
)

7

numpy.tile예를 들어 다음을 사용할 수 있습니다 .

v = 7
rows = 3
cols = 5
a = numpy.tile(v, (rows,cols))
a
Out[1]: 
array([[7, 7, 7, 7, 7],
       [7, 7, 7, 7, 7],
       [7, 7, 7, 7, 7]])

tile(이 경우와 같이 스칼라 대신) 배열을 '타일'하기위한 것이지만 모든 크기와 차원의 미리 채워진 배열을 작성하여 작업을 수행합니다.


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