【发布时间】:2019-04-08 07:59:45
【问题描述】:
在我的other question 之后,我惊讶地发现 Numpy 在 array_like 对象的定义上相当松散。基本上np.array(1) 是一个有效的numpy ndarray,形状为(),尺寸为0! np.array([[1,2],[3]]) 也是一个有效的形状为(2,) 和维度为1 的ndarray。基本上np.array 挖掘尽可能多的维度,直到它达到非均匀性或零维值。这种实现可能非常快,但不一定安全。事实上,它非常容易出错。如果有人忘记了输入列表的一个元素,该函数不会返回任何错误,从而导致代码中出现其他最可能更令人困惑的错误。
我在想是否可以编写一个 checkArr 函数来检查多维列表的同质性和一致性,并且开销尽可能少。清理了其他一些 SO 帖子,我最终得到了这个递归解决方案:
def checkArr(A):
assert isinstance(A, (list,tuple,range)),
"input must be iterable (list, tuple, range)"
assert all(isinstance(a, type(A[0])) for a in A[1:]),
"elements of the input must of a the same type, input must be homogeneous"
if isinstance(A[0], (list,tuple,range)):
assert all(len(a)==len(A[0]) for a in A[1:]),
"elements of the input must of a the same size, input must be uniform"
[checkArr(a) for a in A]
现在我的问题是,这是否是最快的解决方案,还是可能实现更高性能/Pythonic?
【问题讨论】:
标签: python list numpy multidimensional-array