繁体   English   中英

在python中处理多维数组

[英]Manipulating multidimensional arrays in python

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

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

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

我需要的是一种为这些项目依次生成索引的方法,以便可以在相同格式的多个列表上使用它们。 我现在迷失在哪里甚至开始。

编辑:通过索引,我的意思是一种访问不同列表中相应项目的方法。

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]

numpy使您可以使用诸如array[1,2,3]语法索引多维数组。 它通过重写项获取器来接受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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM