首頁 > 後端開發 > Python教學 > 如何有效證明 NumPy 數組中的元素合理?

如何有效證明 NumPy 數組中的元素合理?

Susan Sarandon
發布: 2024-12-09 16:52:11
原創
741 人瀏覽過

How Can I Efficiently Justify Elements in a NumPy Array?

證明NumPy 陣列

簡介

在Python 中提供了高效的數量計算工具。一個常見的挑戰是調整 NumPy 數組中的元素,將它們左對齊、右對齊、上對齊或下對齊。本文提出了一種使用向量化方法的改進解決方案。

向量化解決方案

justify 函數對齊 2D陣列中的元素,將它們推送到指定的位置

def justify(a, invalid_val=0, axis=1, side='left'):
    justified_mask = np.sort(a!=invalid_val, axis=axis)
    if (side=='up') or (side=='left'):
        justified_mask = np.flip(justified_mask,axis=axis)
    out = np.full(a.shape, invalid_val)
    if axis==1:
        out[justified_mask] = a[a!=invalid_val]
    else:
        out.T[justified_mask.T] = a.T[a.T!=invalid_val]
    return out
登入後複製

用法

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

print(justify(a, axis=0, side='up'))  # Justify values vertically "up"
print(justify(a, axis=0, side='down'))  # Justify values vertically "down"
print(justify(a, axis=1, side='left'))  # Justify values horizontally "left"
print(justify(a, axis=1, side='right'))  # Justify values horizontally "right"
登入後複製

輸出

[[1, 7, 2, 8]
 [3, 0, 4, 0]
 [5, 0, 6, 0]
 [0, 0, 0, 0]]

[[0, 0, 0, 0]
 [1, 0, 2, 0]
 [3, 0, 4, 0]
 [5, 7, 6, 8]]

[[1, 2, 0, 0]
 [3, 4, 0, 0]
 [5, 6, 0, 0]
 [0, 7, 0, 8]]

[[0, 0, 1, 2]
 [0, 0, 3, 4]
 [0, 0, 5, 6]
 [0, 0, 7, 8]]
登入後複製

擴展為通用案例

justify_nd 函數擴充了此方法,以對齊任何維度的 ndarray 中的元素。

def justify_nd(a, invalid_val, axis, side):
    justified_mask = np.sort(a!=invalid_val, axis=axis)
    if side=='front':
        justified_mask = np.flip(justified_mask,axis=axis)
    out = np.full(a.shape, invalid_val)
    pushax = lambda a: np.moveaxis(a, axis, -1)
    if (axis==-1) or (axis==a.ndim-1):
        out[justified_mask] = a[a!=invalid_val]
    else:
        pushax(out)[pushax(justified_mask)] = pushax(a)[pushax(a!=invalid_val)]
    return out
登入後複製

用法(一般案例)

a = np.array([[[54, 57,  0, 77],
                       [77,  0,  0, 31],
                       [46,  0,  0, 98],
                       [98, 22, 68, 75]],

                   [[49,  0,  0, 98],
                       [ 0, 47,  0, 87],
                       [82, 19,  0, 90],
                       [79, 89, 57, 74]],

                   [[ 0,  0,  0,  0],
                       [29,  0,  0, 49],
                       [42, 75,  0, 67],
                       [42, 41, 84, 33]],

                   [[ 0,  0,  0, 38],
                       [44, 10,  0,  0],
                       [63,  0,  0,  0],
                       [89, 14,  0,  0]]])

print(justify_nd(a, invalid_val=0, axis=0, side='front'))  # Justify first dimension "front"
print(justify_nd(a, invalid_val=0, axis=1, side='front'))  # Justify second dimension "front"
print(justify_nd(a, invalid_val=0, axis=2, side='front'))  # Justify third dimension "front"
print(justify_nd(a, invalid_val=0, axis=2, side='end'))  # Justify third dimension "end"
登入後複製

輸出

[[[54, 57,  0, 77],
  [77, 47,  0, 31],
  [46, 19,  0, 98],
  [98, 22, 68, 75]],

 [[49,  0,  0, 98],
  [29, 10,  0, 87],
  [82, 75,  0, 90],
  [79, 89, 57, 74]],

 [[ 0,  0,  0, 38],
  [44,  0,  0, 49],
  [42,  0,  0, 67],
  [42, 41, 84, 33]],

 [[ 0,  0,  0,  0],
  [ 0,  0,  0,  0],
  [63,  0,  0,  0],
  [89, 14,  0,  0]]]

[[[54, 57, 68, 77],
  [77, 22,  0, 31],
  [46,  0,  0, 98],
  [98,  0,  0, 75]],

 [[49, 47, 57, 98],
  [82, 19,  0, 87],
  [79, 89,  0, 90],
  [ 0,  0,  0, 74]],

 [[29, 75, 84, 49],
  [42, 41,  0, 67],
  [42,  0,  0, 33],
  [ 0,  0,  0,  0]],

 [[44, 10,  0, 38],
  [63, 14,  0,  0],
  [89,  0,  0,  0],
  [ 0,  0,  0,  0]]]

[[[ 0, 54, 57, 77],
  [ 0,  0, 77, 31],
  [ 0,  0, 46, 98],
  [98, 22, 68, 75]],

 [[ 0,  0, 49, 98],
  [ 0,  0, 47, 87],
  [ 0, 82, 19, 90],
  [79, 89, 57, 74]],

 [[ 0,  0,  0,  0],
  [ 0,  0, 29, 49],
  [ 0, 42, 75, 67],
  [42, 41, 84, 33]],

 [[ 0,  0,  0, 38],
  [ 0,  0, 44, 10],
  [ 0,  0,  0, 63],
  [ 0,  0, 89, 14]]]
登入後複製

以上是如何有效證明 NumPy 數組中的元素合理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板