【问题标题】:Construct an numpy array inside a for loop在 for 循环中构造一个 numpy 数组
【发布时间】:2018-10-12 21:06:12
【问题描述】:

我正在尝试从我的 python 代码中加载一个包含字典列表的数据库。对于列表的每个项目,字典包含一个文件的名称一个子列表,其中包含 n 个不同的字典,其中一个文件名和数据是一个大小为 40x40x3 的 numpy 矩阵并对应于一个图像。我想在 for 循环中将所有这些图像存储在一个大小为 Nx40x40x3 的 numpy 文件中。

for item in dataset: 
    print item["name"] # the name of the list
    print item["data"] # a list of dictionaries
    for row in item["data"]:
      print row["sub_name"] # the name of the image
      print row["sub_data"] # contains an numpy array (my image) 

我如何构造一个 numpy 数组并添加所有图像?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    NumPy 数组 have fixed sizes,因此除非您预先知道大小,否则您必须使用可以更改大小的东西,例如 python 列表。

    import numpy as np
    
    images = []
    
    for item in dataset:
        for row in item["data"]:
            images.append(row["sub_data"]) # Add to list
    
    images = np.array(images) # Convert list to np.array()
    

    【讨论】:

    • 我认为您的意思是“NumPy 数组具有固定大小”。它们不是一成不变的。
    • 或者,您可以先获取数组的必要大小,然后填充它
    • 虽然,既然你已经提供了那个链接,第二个答案提醒我,在非常特定的条件下,调整一些 NumPy 数组的大小是technically possible。它是有限的,它的效率是不可预测的(因为它取决于 realloc 是否必须复制),它与 PyPy 不兼容,而且它总体上是一个比预置数组或使用列表更糟糕的选择,但从技术上讲,这个选项是存在的。
    • 最终转换后的列表大小是(N, )而不是(N, 28x28x3)。
    • @JoseRamon 我相信这意味着您的数据不是完全相同的形状,它使用我的示例数据工作。
    【解决方案2】:

    为了做到这一点,您要么需要像我在other answer 中所做的那样使用大小可以改变的数据类型,要么您还可以弄清楚在定义大批。 (正如@P.Camilleri 所建议的)

    这是一个例子:

    # Count nuber of images
    idx_count = 0
    for item in dataset:
        idx_count += len(item['data'])
    
    # Create an empty numpy array that's Nx3x3
    images = np.empty((count, 3, 3))
    
    # Populate numpy array with images
    idx = 0
    for item in dataset:
        for row in item["data"]:
            images[idx] = row["sub_data"]
            idx += 1
    
    print(images)
    

    这样做的好处是你只分配一次空间,与使用 python 列表相反,它首先添加到列表中然后复制到 numpy 数组中。

    但是,这是以必须对数据进行两次迭代为代价的。

    (注意:两个独立的答案,因此我不确定哪个解决方案更好,因此可以分别对它们进行评分。)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-19
    • 2012-01-31
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多