효율적인 numpy 값을 할당 via boolean 마스크

0

질문

나는 부울 마스크 값을 할당하여 문제가 필요 효율적인 부울 마스크 작업입니다.

그것은 다중 차원스크 사용하고 있는데 einsum 결과를 달성하기 위해,하지만 작업은 매우 효율적이고,내가 궁금해 얻을 수 있다면,그것으로 도움이 여기에는 현재 해결책:(모두 mask, truth_value, false_value 은 거짓과 데이터를 dtype 및 모양과 일치하는 내 문제입니다.

mask = np.random.randn(1000, 50)> 0.5
truth_value = np.random.randn(50, 10)
false_value = np.random.randn(10)
objective = np.einsum('ij,jk->ijk', mask, truth_value) + np.einsum('ij,k->ijk', ~mask, false_value)

이 있을 얻을 수있는 빠른 방법 objectivemask, truth_value, false_value ?

는 동안 기다리고 있었,생각하는 빠른 방법

objective = np.where(mask[...,np.newaxis], np.broadcast_to(truth_value, (1000, 50, 10)), np.broadcast_to(false_value,  (1000, 50, 10)))

그러나 어떤 대?

mask numpy python
2021-11-21 23:00:26
1

최고의 응답

0

사용할 수 있습니다 Numba JIT 를 수행하는 더 효율적으로 합니다.

import numpy as np
import numba as nb

@nb.njit('float64[:,:,::1](bool_[:,::1], float64[:,::1], float64[::1])')
def blend(mask, truth_value, false_value):
    n, m = mask.shape
    l = false_value.shape[0]
    assert truth_value.shape == (m, l)
    result = np.empty((n, m, l), dtype=np.float64)
    for i in range(n):
        for j in range(m):
            if mask[i, j]:
                result[i, j, :] = truth_value[j, :]
            else:
                result[i, j, :] = false_value[:]
    return result

mask = np.random.randn(1000, 50) > 0.5
truth_value = np.random.randn(50, 10)
false_value = np.random.randn(10)
objective = blend(mask, truth_value, false_value)

계산 objective4.8 배 더 빠르게 내 컴퓨터에.

되지 않은 경우,충분히 빠르게 시도할 수 있습을 병렬화를 사용하여 코드를 매개변수 parallel=Truenb.prangerange 에서 나는 기반 loop. 이되지 않을 수 있으로 인해 빠르게를 만들기 위한 오버헤드를 새로운 스레드입니다. 내 컴퓨터에(6 코어),병렬 버전의 7.4 배 더 빠르게 (스레드의 작성은 꽤 비싼 비행 시간).

또 다른 가능한 최적화를 직접 작성하는 결과 버퍼에 할당된 시간에 앞서(이것만 잘하는 경우 이 함수를 호출할을 여러 번과 동일한 배열의 크기).

여기에는 전반적인 타이밍 내 컴퓨터에서:

np.einsum:         4.32 ms
np.where:          1.72 ms
numba sequential:  0.89 ms
numba parallel:    0.58 ms
2021-11-21 23:52:43

감사합니다! 이것은 참으로 빠르게 보다 나 einsum 솔루션! 는 것보다 더 나 np.where +np.broadcast_to 기반 솔루션입니다.
yupbank

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................