【问题标题】:Python numpy array merging manipulationPython numpy 数组合并操作
【发布时间】:2016-11-27 18:13:30
【问题描述】:

我目前正在使用 Pillow 来访问图像的每个像素,并将 RGB 值替换为列表的元素。

但是我认为这种方法很慢,我读到一种更快的方法是使用 numpy 数组。

我将图像转换为形状为 (x, y, 3) 的 numpy 数组,但我不知道如何将它与我的列表“合并”。例如,我有一个包含 20 个元素的列表,因此我想将数组中的前 20 个元素替换为列表中的元素,而不改变数组的形状。

我的数组如下所示:

[[[121, 222, 222], [1, 1, 1],...]]

我有一个列表,例如:

[120, 99, 0, 88, 78, 32, 123,...]

最终的数组应该是这样的:

[[[120, 99, 0], [88, 78, 32], [123, ..., ...],...]]

列表比数组短,所以当列表结束时,数组后面的元素应该保持不变。

我尽量解释清楚,有不清楚的地方请告诉我。

提前致谢。

【问题讨论】:

    标签: python arrays image numpy


    【解决方案1】:

    使用a 作为数组,L 作为列表,您可以简单地使用np.ravel() 获得数组的平面视图,并通过slicingL 中的值分配给它,就像这样 -

    a.ravel()[:len(L)] = L
    

    或者,我们可以使用 np.put 隐式获取展平视图并为您分配它,就像这样 -

    np.put(a, range(len(L)), L)
    

    如果我必须选择,我会使用ravel() 方法,因为它通过使用slicing 来避免需要range

    示例运行 -

    In [51]: a
    Out[51]: 
    array([[[91, 18, 74],
            [49, 92, 93],
            [42, 38, 41],
            [27, 24, 69]],
    
           [[14, 72, 49],
            [85, 74, 45],
            [32, 88, 89],
            [12, 85, 60]]])
    
    In [52]: L = [120, 99, 0, 88, 78, 32, 123]
    
    In [53]: a.ravel()[:len(L)] = L
    
    In [54]: a
    Out[54]: 
    array([[[120,  99,   0],
            [ 88,  78,  32],
            [123,  38,  41],
            [ 27,  24,  69]],
    
           [[ 14,  72,  49],
            [ 85,  74,  45],
            [ 32,  88,  89],
            [ 12,  85,  60]]])
    

    【讨论】:

    • 谢谢,这行得通。但是在我的情况下,列表的元素是通过对数组元素执行按位运算生成的。特别是我有一个包含位的列表,我想更改数组的每个元素以使列表中的位为 LSB。
    • @FrancescoCarzaniga 在前面的问题中应该提到这些重要的部分。希望您在以后的问题中牢记这一点。现在,请使用这些详细信息编辑问题,并向我们展示更合适/具有代表性的示例输入和预期输出。
    • 是的,您是对的,很抱歉,感谢您的回答,但是我找到了针对我的具体问题的解决方案。再次非常感谢!
    【解决方案2】:

    一个非常简单的解决方案是使用列表推导。看看这个:

    假设lst 是列表

    lst = [120, 99, 0, 88, 78, 32, 123, 1, 2]
    np.array([lst[x:x+3] for x in range(0, len(lst), 3)])
    

    输出:

    array([[120,  99,   0],
           [ 88,  78,  32],
           [123,   1,   2]])
    

    【讨论】:

      猜你喜欢
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 2021-09-05
      • 2015-09-22
      • 2014-06-14
      相关资源
      最近更新 更多