【问题标题】:Create 2D lists in python with variable length indexed vectors在 python 中使用可变长度索引向量创建二维列表
【发布时间】:2016-07-04 22:25:50
【问题描述】:

我正在处理一个图像处理问题,我的代码看起来像这样(下面编写的代码只是说明了我想要解决的问题类型):

for i in range(0,10):
  for j in range(0,10):
    number_length = round(random.random()*10)
    a = np.zeros(number_length)
    Z[i][j] = a

我想要做的是创建某种 2D 列表或 np.array(不太确定),我基本上为图像中的每个像素索引一个术语,并为每个像素的每个像素创建一个向量/值列表我无法预料它的长度,此外,每个索引像素的每个向量的长度彼此不同。解决此问题的最佳方法是什么?

在我的 MATLAB 代码中,解决方法很简单:我定义了一个 2D 单元并将任何向量分配给 2D 单元中的任何元素。由于细胞不会抱怨每个索引向量的相干长度,这是一件好事。在 python 中处理这个问题的等效最佳解决方案是什么?

理想情况下,解决方案应该涉及预测任何像素的“a”的最大长度并使所有索引向量的长度相同(因为这意味着我必须做某种零填充如果索引向量是高维的并且这些高维向量在整个图像中是稀疏的,则会消耗内存。

【问题讨论】:

    标签: python arrays matlab list vector


    【解决方案1】:

    NumPy 数组不起作用,因为它需要固定维度。您可以使用二维列表(即列表列表),其中每个元素可以是任意长度的数组。这类似于您在 Matlab 中的设置,使用二维向量元胞数组。

    试试这个:

    z = [[np.zeros(np.random.randint(10)+1) for j in range(10)] for i in range(10)]
    

    这将创建一个 10x10 列表,其中 z[i][j] 是一个 NumPy 数组,其中包含随机长度(从 1 到 10)的零。

    编辑(评论中要求嵌套循环):

    z = [[None for j in range(10)] for i in range(10)]
    
    for i in range(len(z)):
        for j in range(len(z[i])):
            z[i][j] = np.zeros(np.random.randint(10)+1)
    

    【讨论】:

    • 有没有办法可以做到这一点,但是通过在两个连接的 for 循环中声明 z 的状态,而不是相反?我要求这样做,因为在我使用的实际算法中,列表中每个元素的长度是在复杂的算法之后计算出来的,而不仅仅是一个随机数(它只是用作说明在 2D 中显示可变长度列表)。
    • 我编辑了答案以显示嵌套循环方法
    • 正是我想要的!
    猜你喜欢
    • 2016-12-14
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2017-09-08
    • 2019-04-28
    • 2016-09-02
    相关资源
    最近更新 更多