2016-11-27 107 views
1

我目前使用Pillow来访问图像的每个像素,并用列表元素替换RGB值。Python numpy数组合并操作

但是我认为这个方法很慢,我读了一个更快的方法来使用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, ..., ...],...]] 

名单短于数组,因此当列表结束时,数组中的元素应保持不变。

我试图尽可能地解释,有些事情还不清楚,请让我知道。

提前致谢。

回答

1

随着a作为数组和L作为列表,你可以简单地得到阵列的平面视图与np.ravel()slicing分配从L值到它,就像这样 - 或者

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

,我们可以使用np.put,这样会隐含获得平展视图,并为它分配给你,就像这样 -

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

如果我必须选择,我会去与T他通过使用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]]]) 
+0

谢谢,这个作品。但在我的情况下,列表中的元素是通过对数组元素执行按位操作生成的。特别是我有一个包含位的列表,我想更改数组中的每个元素以将列表中的位设置为LSB。 –

+0

@FrancescoCarzaniga在这个问题上应该提到像这些重要的位。希望你在将来的问题中记住这一点。现在,请编辑具有这些细节的问题,并向我们展示更合适/有代表性的样本输入和预期输出。 – Divakar

+0

是的,你是对的我很抱歉,谢谢你的回答,但我找到了解决我的具体问题。再一次非常感谢你! –

0

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

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