查找多维 Python 数组的维度

在 Python 中,是否可以编写一个返回多维数组维度的函数(假设数组的维度不是锯齿状的)?

例如, [[2,3], [4,2], [3,2]] 的维度将是 [3, 2] ,而 [[[3,2], [4,5]],[[3,4],[2,3]]] 的维度将是 [2,2,2]

Python 是否有任何内置函数可以返回多维数组的所有维度,还是我需要自己实现这个函数?

stack overflow Find the dimensions of a multidimensional Python array
原文答案
author avatar

接受的答案

不,没有任何内置的,因为这样的“数组”1 它可能是锯齿状的,“尺寸”或“形状”的概念根本没有任何意义。所以,你必须自己写。如果您可以假设所有维度上的一致性,您可以按照以下步骤进行:

dim1 = len(a)
dim2 = len(a[0])
dim3 = len(a[0][0])
.
.
.

让这个递归来处理所有维度是很容易的。这应该这样做:

def dim(a):
    if not type(a) == list:
        return []
    return [len(a)] + dim(a[0])

但是,如果您需要这样的东西,您可能需要考虑查看具有 NumPynumpy.ndarray.shape 数组,这将为您提供所需的内容。

from numpy import array
l = [[2, 3], [4, 2], [3, 2]]
a = array(l)
print a.shape

输出

(3, 2)

1 在吓人的引号中,因为您不是真的在看数组,而是在看一个列表,或列表列表,或列表列表...。


答案:

作者头像

你可以用 numpy 做到这一点:

import numpy
l = [[2,3], [4,2], [3,2]]
m = numpy.array(l)
print m.shape

但是你的第二个例子的形状是[2,2,2],而不是[1,4,5],除非我误解了你的问题......

作者头像

那不是一个多维数组。它是一个 list 。它恰好包含其他列表。没有什么可以说您的列表不能是:

[[2,3], [4,2], [3,2,4,5,6]]

在这种情况下,您希望这样的函数返回什么值?

没有通用函数可以满足您的要求,尤其是因为 Python 本身没有定义矩阵/数组类。如果您准备对列表的一致性做出假设或编写断言,您当然可以编写自己的函数,该函数对列表和元组等可迭代对象进行操作。对第一个维度使用 len(a) ,对第二个维度使用 len(a[0]) ,依此类推。递归将成为您的朋友。

如果您对矩阵使用 numpy 数组,老实说这很有意义,那么您的函数将存在(它是 ndarray 类的 shape 属性)并且是有意义的。

作者头像

假设输入数组不是锯齿状的:

def arr_dimen(a):
  return [len(a)]+arr_dimen(a[0]) if(type(a) == list) else []
作者头像
import numpy as np
# define array 3 row and 5 colums
a = np.arange(15).reshape(3, 5)
print ("the array elements:n",a);
# print all dim 
print("all dim :n",a.shape)
# the print the number of row only
print("the number of rows :n",a.shape[0])
# the print the number of colume only
print("the number of cols :n",a.shape[1])

[enter image description here ](https://i.stack.imgur.com/03y2q.png

作者头像

迭代方法

a = [[[3,2], [4,5]],[[3,4],[2,3]]]
shape = []
b = a
while type(b) == list:
    shape.append(len(b))
    b = b[0]
print(shape)