【问题标题】:Find the dimensions of a multidimensional Python array查找多维 Python 数组的维数
【发布时间】:2013-07-06 02:09:27
【问题描述】:

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

例如,[[2,3], [4,2], [3,2]] 的尺寸为[3, 2],而[[[3,2], [4,5]],[[3,4],[2,3]]] 的尺寸为[2,2,2]

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

【问题讨论】:

  • 不是第二个例子 [2, 2, 2] 吗?
  • 出于好奇,它会对[[1,2],[3,4,5]] 做什么?还是[[1,2],[3,4],[5,[6,7]]]
  • @DRC 谢谢,我修好了。
  • @Wrikken 我正在假设输入数组不会是锯齿状的。我想先检查数组维度的规律性,如果数组是锯齿状的,则抛出错误。
  • 不清楚为什么这被标记为重复:“重复”是关于 numpy 数组,这是关于 Python 列表。那里的答案对OP没有帮助。

标签: python arrays dimensions


【解决方案1】:
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])

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • Python中的数组和列表有什么区别吗?我认为它们是同义词。
    • 当然,假设 OP 的数据确实具有规则的形状并提供除非答案之外的其他内容,这将更具建设性。或者要求澄清而不是假设。
    • @AndersonGreen Python 没有数组。它有列表和元组。但没有数组。
    • @millimoose 我没有假设任何关于 OP 的数据。我试图解释为什么 Python 的设计者不能编写这样的通用函数,因为他们无法做出这样的假设。
    • @DavidHeffernan 我错过了 OP 的问题中他们专门询问内置函数的部分,因为它们以“是否可以编写...”开头。你是对的,提供这样一个内置函数是没有意义的,因为它需要考虑数据不规则的情况,并且这种通用性太麻烦而收益太少。 (过度使用处理此问题的库。)
    【解决方案3】:

    不,没有任何内置的,因为这样的“数组”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])
    

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

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

    输出

    (3, 2)
    

    1 用吓人的引号,因为你不是真的在看数组,你在看一个列表,或者一个列表的列表,或者一个列表的列表....

    【讨论】:

    • " "尺寸" 或 "形状" 的概念根本没有任何意义" 不知道你为什么会这样说?这很有意义,您的回答清楚地表明了这一点。 Numpy 优雅地处理这种事情,但显然它并不完全相同。坦率地说,似乎应该将形状添加为属性(锯齿状的情况可能只会返回错误)。
    • Python 应该有这个功能。
    【解决方案4】:

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

    def arr_dimen(a):
      return [len(a)]+arr_dimen(a[0]) if(type(a) == list) else []
    

    【讨论】:

    • @millimoose 在发帖时重命名了函数。错过在通话中重命名。感谢您指出这一点。
    【解决方案5】:

    你可以用 numpy 做到这一点:

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

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

    【讨论】:

    • 是的,我的意思是 [2,2,2] 而不是 [1,4,5]。
    • print m.shape 在 Python 2 中语法上有效,但在 Python 3 中无效。
    • 我现在使用 numpy 这么多,这些关于列表的问题只是让我感到困惑。我猜是时候查看列表了吗?
    • 在 Python 3 中使用 print(m.shape)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多