检查numpy数组的形状

时间:2019-02-10 15:50:18

标签: python numpy

我想编写一个带有numpy数组的函数,并且想检查它是否满足要求。让我感到困惑的一件事是:

np.array([1,2,3]).shape = np.array([[1,2,3],[2,3],[2,43,32]]) = (3,)

[1,2,3]应该被允许,而[[1,2,3],[2,3],[2,43,32]]则不允许。

允许的形状:

[0, 1, 2, 3, 4]
[0, 1, 2]
[[1],[2]]
[[1, 2], [2, 3], [3, 4]]

不允许:

[] (empty array is not allowed)
[[0], [1, 2]] (inner dimensions must have same size 1!=2)
[[[4,5,6],[4,3,2][[2,3,2],[2,3,4]]] (more than 2 dimension)

1 个答案:

答案 0 :(得分:0)

您应该从定义形状开始。我试图从问题中理解它,如果不正确,请添加更多详细信息。

因此,这里我们有(1)不允许为空数组,并且(2)不得超过二维。它的翻译方式如下:

def is_allowed(arr):
  return arr.shape != (0, ) and len(arr.shape) <= 2

第一个条件只是将数组的形状与空数组的形状进行比较。第二个条件检查数组的维数不超过二维。

内部尺寸存在问题。您作为示例提供的某些列表不是numpy数组。如果强制转换np.array([[1,2,3],[2,3],[2,43,32]]),则会得到一个数组,其中每个元素都是列表。它不是可以直接访问所有元素的“实际” numpy数组。参见示例:

>>> np.array([[1,2,3],[2,3],[2,43,32]])
array([list([1, 2, 3]), list([2, 3]), list([2, 43, 32])], dtype=object)
>>> np.array([[1,2,3],[2,3, None],[2,43,32]])
array([[1, 2, 3],
       [2, 3, None],
       [2, 43, 32]], dtype=object)

因此,我建议(如果您使用常规列表进行操作)检查所有数组的长度是否相同,但不要使用numpy。