首页 >后端开发 >Python教程 >NumPy 的向量化函数如何有效地证明数组的合理性?

NumPy 的向量化函数如何有效地证明数组的合理性?

DDD
DDD原创
2024-12-09 11:05:06275浏览

How Can NumPy's Vectorized Functions Efficiently Justify Arrays?

使用向量化函数来证明 NumPy 数组

NumPy 提供了使用向量化函数来证明数组的有效方法,与传统的 Python 循环相比,提供了更高的性能和代码简单性。

问题陈述

给定 NumPy数组,任务是将其非零元素向左、向右、向上或向下移动,同时保持其形状。

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 数组。它的工作原理是使用 mask 识别非零元素,使用 sort 对它们进行排序,如果向上或向左对齐则翻转 mask,最后用对齐的值覆盖原始数组。

示例用法

这是一个使用示例,涵盖了非零元素左:

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