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

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

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

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

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



답변

도입 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]])

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


답변

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


답변

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

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

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


답변

명백히, 절대 속도뿐만 아니라 속도 순서 (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!)

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


답변

나는했다

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,
)


답변

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(이 경우와 같이 스칼라 대신) 배열을 ‘타일’하기위한 것이지만 모든 크기와 차원의 미리 채워진 배열을 작성하여 작업을 수행합니다.


답변

numpy없이

>>>[2]*3
[2, 2, 2]