Python numpy数组合并操作

Python numpy数组合并操作,python,arrays,image,numpy,Python,Arrays,Image,Numpy,我目前正在使用枕头访问图像的每个像素,并用列表中的元素替换RGB值 然而,我认为这种方法非常慢,我读到一种更快的方法是使用numpy数组 我将图像转换为具有形状(x,y,3)的numpy数组,但我不知道如何将其与列表“合并”。例如,我有一个包含20个元素的列表,所以我想用列表中的元素替换数组中的前20个元素,而不改变数组的形状 我的数组如下所示: [[[121, 222, 222], [1, 1, 1],...]] [[[120, 99, 0], [88, 78, 32], [123, ...

我目前正在使用枕头访问图像的每个像素,并用列表中的元素替换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,...]
最后一个数组应该如下所示:

[[[121, 222, 222], [1, 1, 1],...]]
[[[120, 99, 0], [88, 78, 32], [123, ..., ...],...]]
列表比数组短,因此当列表结束时,后面的数组元素应该保持不变

我尽力解释清楚,有什么不清楚的请告诉我


提前感谢。

使用
a
作为数组,使用
L
作为列表,您可以简单地获得数组的平面视图,并将
L
中的值分配给它,如下所示-

a.ravel()[:len(L)] = L
np.put(a, range(len(L)), L)
或者,我们可以使用隐式获取展平视图并为您分配它,如下所示-

a.ravel()[:len(L)] = L
np.put(a, range(len(L)), L)
如果必须选择,我将使用
ravel()
方法,因为它通过使用
切片来避免对
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]]])

一个非常简单的解决方法是使用列表理解。看看这个:

假设列表为
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]])

谢谢,这个有用。但是,在我的例子中,列表的元素是通过对数组的元素执行逐位操作生成的。特别是我有一个包含位的列表,我想更改数组的每个元素,使列表中的位成为LSB。@Francescarazaniga前面的问题中应该提到这些重要的位。希望你在今后的提问中牢记这一点。现在,请用这些细节编辑问题,并请向我们展示更合适/更具代表性的样本输入和预期输出。是的,你是对的,很抱歉,感谢你的回答,但是我找到了解决我具体问题的方法。再次非常感谢!