【问题标题】:Putting incomplete nested lists in a rectangular ndarray将不完整的嵌套列表放入矩形 ndarray
【发布时间】:2013-05-17 08:15:53
【问题描述】:

在 Python(也使用 numpy)中,我有一个列表列表,每个列表的长度不同。

[
    [
         ["header1","header2"],
         ["---"],
         [],
         ["item1","value1"]
    ],

    [
         ["header1","header2","header3"],
         ["item2","value2"],
         ["item3","value3","value4","value5"]
    ]
]

我想让这个数据结构矩形:即保证len(list[x])对于所有x是恒定的,len(list[x][y])对于所有x、y等都是恒定的。

(这是因为我想将数据结构导入numpy)

我可以想到各种非pythonic的方法来做这样的事情(迭代结构,记录每个级别的最大长度,使用None进行第二次传递和填充值,但必须有更好的方法。

(我也希望解决方案不依赖于结构的维度;即它也应该适用于此类结构的列表......)

有没有我想念的简单方法?

【问题讨论】:

  • 您在这里有三个级别的列表 - 它需要在哪些级别上成为矩形? (或立方,我猜,对于所有三个)。
  • 一旦数据在 NumPy 中,您将如何处理?
  • Lattyware:全部;我最终想要的数据结构应该可以描述为 x×y×z 长方体。 KarlKnechtel:使用 Numpy 的多维切片,根据诸如“与字符串“My Data”在同一列中与字符串“Header Row”在同一行中”之类的内容来识别我真正感兴趣的数据。
  • 您最初是如何获得这些数据的?它是来自您的其他一些代码,还是从 csv/json/xml 或其他形式的结构化数据中读取的?
  • 作为一个小小的元点,我真的很好奇你为什么要使用 Numpy。在这种情况下,Numpy 提供了哪些普通列表不提供的功能?更广泛地说,虽然 numpy 完全能够存储各种奇怪的数据类型,但我不确定为什么有人将它用于非简单类型(这真是好奇!)。

标签: python list numpy nested-lists multidimensional-array


【解决方案1】:

您可以创建具有所需尺寸的ndarray 并轻松阅读您的列表。由于您的列表不完整,您必须抓住IndexError,这可以在try / exception 块中完成。

使用numpy.ndenumerate 可以让解决方案轻松扩展到更多维度(在下面的for 循环中添加更多索引i,j,k,l,m,n,...):

import numpy as np
test = [ [ ["header1","header2"],
           ["---"],
           [],
           ["item1","value1"] ],
         [ ["header1","header2","header3"],
           ["item2","value2"],
           ["item3","value3","value4","value5"] ] ]


collector = np.empty((2,4,4),dtype='|S20')

for (i,j,k), v in np.ndenumerate( collector ):
    try:
        collector[i,j,k] = test[i][j][k]
    except IndexError:
        collector[i,j,k] = ''


print collector
#array([[['header1', 'header2', '', ''],
#        ['---', '', '', ''],
#        ['', '', '', ''],
#        ['item1', 'value1', '', '']],
#       [['header1', 'header2', 'header3', ''],
#        ['item2', 'value2', '', ''],
#        ['item3', 'value3', 'value4', 'value5'],
#        ['', '', '', '']]],  dtype='|S10')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2019-07-18
    • 2022-01-23
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多