【问题标题】:Manipulating multidimensional arrays in python在python中操作多维数组
【发布时间】:2015-12-13 21:40:05
【问题描述】:

我的输入是几个不规则的、包含浮点数的多维数组,看起来像这样:

[[[0.34774399349216734, -0.49837251730235765, 0.12359046385526962, 0.03052580675850769], 
[0.9030134040537152, -0.7537158452634996, 0.2910583603657293, -0.22034711903454673]], 
[[-0.9383578579687082, -0.2281750912629248, 0.052722557936115466]]]

每个列表中的层数和项目数在一个对象的实例中是相同的,但在对象之间会有所不同。

我需要的是一种依次为每个项目生成索引的方法,以便它们可以用于相同格式的多个列表。我现在不知从何开始。

编辑:我所说的索引是指一种访问不同列表中相应项目的方法。

【问题讨论】:

  • 考虑使用numpy?
  • 您的要求不是很清楚。你能举例说明这些索引是什么样的吗?

标签: python arrays multidimensional-array


【解决方案1】:
array = [[[1,2,3,4,5],[3,1,4,2,5],[2,1,4,6,3]],
[[1,2,3],[4,2,6]],
[[3,6,7],[7,4,6],[2,1,4]]]

您可以像这样访问所有元素:

for lists in array:
    for list in lists:
        for num in list:
            print num

所以要获取每个列表中的第一个元素:

for lists in array:
    for list in lists:
            print list[0]

或者,如果您已经知道数组的维度,为什么不直接引用它们:

array [0][0][0]

或使用您的符号:

array [i][j][k]

【讨论】:

    【解决方案2】:

    numpy 允许您使用array[1,2,3] 等语法对多维数组进行索引。它通过覆盖项目 getter 来接受 tuple 而不是整数或可散列对象(如列表和字典)来做到这一点。但是numpy 在处理维度变化的数组时就不是那么优雅了,所以你不会有太多运气直接切换到numpy

    不过,您可以使用类似的技术。您的索引可以是tuple(或任何序列,真的),然后它只是编写支持框架的一个案例。由于构建一个类可能很复杂,我所做的只是实现了一个使用tuple 索引的函数,并且我添加了一个用于测试的枚举函数。

    array = [[[0.34774399349216734, -0.49837251730235765, 0.12359046385526962, 0.03052580675850769], 
    [0.9030134040537152, -0.7537158452634996, 0.2910583603657293, -0.22034711903454673]], 
    [[-0.9383578579687082, -0.2281750912629248, 0.052722557936115466]]]
    
    def array_enum(array):
        """enumerate multidimensional array returning indextuple, value for
        each leaf node value.
        """
        for i, item in enumerate(array):
            if isinstance(item, list):
                for subindex, val in array_enum(item):
                    yield (i,) + subindex, val
            else:
                yield (i,), item 
    
    def array_get_item(array, indextuple):
        """Use index values in indextuple to return item from
        multidimensional array.
        """
        for i in indextuple[:-1]:
            array = array[i]
        return array[indextuple[-1]]
    
    for indextuple, val in array_enum(array):
        orig_val = array_get_item(array, indextuple)
        print(indextuple, val, orig_val, val == orig_val)
    

    您的示例数组的结果是

    (0, 0, 0) 0.34774399349216734 0.34774399349216734 True
    (0, 0, 1) -0.49837251730235765 -0.49837251730235765 True
    (0, 0, 2) 0.12359046385526962 0.12359046385526962 True
    (0, 0, 3) 0.03052580675850769 0.03052580675850769 True
    (0, 1, 0) 0.9030134040537152 0.9030134040537152 True
    (0, 1, 1) -0.7537158452634996 -0.7537158452634996 True
    (0, 1, 2) 0.2910583603657293 0.2910583603657293 True
    (0, 1, 3) -0.22034711903454673 -0.22034711903454673 True
    (1, 0, 0) -0.9383578579687082 -0.9383578579687082 True
    (1, 0, 1) -0.2281750912629248 -0.2281750912629248 True
    (1, 0, 2) 0.052722557936115466 0.052722557936115466 True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多