如何仅使用NumPy方法判断方阵是否为指定规则排列数组
题目定义
Arranged array(排列数组)是维度为2的N×N方阵,矩阵内任意单元格均满足规则:
A[I,J] > A[I,J+1]且A[I,J] > A[I+1,J],即每行从左到右严格递减、每列从上到下严格递减。
实现要求
- 编写函数接收NumPy数组作为输入,若输入数组符合上述Arranged array定义则返回
True,否则返回False - 实现约束:禁止使用循环、列表推导(list comp)或递归,必须使用NumPy原生向量化能力实现
- 前提假设:输入数组非空、无NA值、所有元素均为数值类型
原有问题实现
原有实现既不符合NumPy编码风格,还存在逻辑错误:仅判断数组拉平后是否为全局降序,无法识别行、列分别递减但全局顺序不严格逐行递减的合法矩阵,且额外增加了题目未要求的「元素不可重复」校验,代码如下:
def is_square_ordered_matrix(A): # Checking if the dimension is 2 if A.ndim != 2: return False # Checking if it is a squared matrix if A.shape[0] != A.shape[1]: return False # Saving the original shape to reshape later originalDim = A.shape # Making it a dim of 1 to use it as a list arrayAsList = list((A.reshape((1,originalDim[0]**2)))[0]) # Keeping original order before sorting originalArray = arrayAsList[:] # Using the values of the list as keys to see if there are doubles valuesDictionary = dict.fromkeys(arrayAsList, 1) # If len is different, means there are doubles and i should return False if len(arrayAsList) != len(valuesDictionary): return False # If sorted list is equal to original list it means the original is already ordered and i should return True arrayAsList.sort(reverse=True) if originalArray == arrayAsList: return True else: return False
测试用例
- 合法用例(应返回
True):
is_square_ordered_matrix(np.arange(8,-1,-1).reshape((3,3)))
- 非法用例(应返回
False):
# 升序排列,不符合递减要求 is_square_ordered_matrix(np.arange(9).reshape((3,3))) # 非方阵 is_square_ordered_matrix(np.arange(5,-1,-1).reshape((3,2)))
NumPy风格正确实现
直接通过NumPy切片和向量化比较完成规则校验,无任何循环、列表推导或递归,逻辑完全匹配题目定义:
import numpy as np def is_square_ordered_matrix(A): # 校验是否为2维数组 if A.ndim != 2: return False # 校验是否为方阵 rows, cols = A.shape if rows != cols: return False # 校验每行严格满足左值>右值(从左到右递减) row_decreasing = (A[:, :-1] > A[:, 1:]).all() # 校验每列严格满足上值>下值(从上到下递减) col_decreasing = (A[:-1, :] > A[1:, :]).all() return row_decreasing and col_decreasing
实现逻辑说明:
A[:, :-1]取所有行除最后一列的元素,A[:, 1:]取所有行除第一列的元素,两者逐元素比较即可一次性得到所有单元格和右侧相邻单元格的大小关系,通过.all()判断是否全部满足大于要求- 列校验逻辑同理,通过行切片取上下相邻元素做逐元素比较
- 所有操作均为NumPy原生向量化运算,无任何显式/隐式循环,性能远高于转列表排序的实现,同时修正了原有实现的逻辑偏差
内容的提问来源于stack exchange,提问作者WalaWizon
相关产品推荐
相关产品推荐

