>백엔드 개발 >파이썬 튜토리얼 >NumPy의 벡터화된 함수는 어떻게 배열을 효율적으로 정당화할 수 있습니까?

NumPy의 벡터화된 함수는 어떻게 배열을 효율적으로 정당화할 수 있습니까?

DDD
DDD원래의
2024-12-09 11:05:06283검색

How Can NumPy's Vectorized Functions Efficiently Justify Arrays?

벡터화된 함수로 NumPy 배열 정당화

NumPy는 벡터화된 함수를 사용하여 배열을 정당화하는 효율적인 방법을 제공하여 기존 Python 루프에 비해 향상된 성능과 코드 단순성을 제공합니다.

문제 설명

NumPy 제공 배열의 경우 작업은 모양을 유지하면서 0이 아닌 요소를 왼쪽, 오른쪽, 위 또는 아래로 이동하는 것입니다.

Numpy 솔루션

다음 NumPy 구현은 효율적인 정렬을 수행합니다.

import numpy as np

def justify(a, invalid_val=0, axis=1, side='left'):    
    if invalid_val is np.nan:
        mask = ~np.isnan(a)
    else:
        mask = a!=invalid_val
    justified_mask = np.sort(mask,axis=axis)
    if (side=='up') | (side=='left'):
        justified_mask = np.flip(justified_mask,axis=axis)
    out = np.full(a.shape, invalid_val) 
    if axis==1:
        out[justified_mask] = a[mask]
    else:
        out.T[justified_mask.T] = a.T[mask.T]
    return out

이 함수는 지정된 축과 측면(왼쪽, 오른쪽, 위, 아래)을 따라 2D 배열을 정렬합니다. 마스크를 사용하여 0이 아닌 요소를 식별하고, 정렬을 사용하여 정렬하고, 위쪽이나 왼쪽으로 정렬하는 경우 마스크를 뒤집고, 마지막으로 양쪽 정렬된 값으로 원래 배열을 덮어쓰는 방식으로 작동합니다.

사용 예

다음은 0이 아닌 요소를 다루는 사용 예입니다. 왼쪽:

a = np.array([[1,0,2,0], 
              [3,0,4,0], 
              [5,0,6,0], 
              [0,7,0,8]])

# Cover left
covered_left = justify(a, axis=1, side='left')

print("Original Array:")
print(a)
print("\nCovered Left:")
print(covered_left)

출력:

Original Array:
[[1 0 2 0]
 [3 0 4 0]
 [5 0 6 0]
 [0 7 0 8]]

Covered Left:
[[1 2 0 0]
 [3 4 0 0]
 [5 6 0 0]
 [7 8 0 0]]

일반 N차원 배열 정렬

N차원 배열 정렬을 위해 다음 함수를 사용할 수 있습니다. :

def justify_nd(a, invalid_val, axis, side):    
    pushax = lambda a: np.moveaxis(a, axis, -1)
    if invalid_val is np.nan:
        mask = ~np.isnan(a)
    else:
        mask = a!=invalid_val
    justified_mask = np.sort(mask,axis=axis)
    
    if side=='front':
        justified_mask = np.flip(justified_mask,axis=axis)
            
    out = np.full(a.shape, invalid_val)
    if (axis==-1) or (axis==a.ndim-1):
        out[justified_mask] = a[mask]
    else:
        pushax(out)[pushax(justified_mask)] = pushax(a)[pushax(mask)]
    return out

이 함수는 임의의 축을 따라 N차원 배열을 정당화하고 배열의 '앞' 또는 '끝'에.

위 내용은 NumPy의 벡터화된 함수는 어떻게 배열을 효율적으로 정당화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.