如何创建用零初始化的元组矩阵

时间:2016-06-13 14:46:33

标签: python image numpy matrix

我正在制作一张照片,我使用numpy。 我尝试了类似的东西,但得到了一个错误     data = np.zeros((pic.size [0],pic.size [1],2),dtype = [[(0,0,0)],]) 我想让它看起来像

[[(0,0,0),(0,0,0),(0,0,0)],[(0,0,0),(0,0,0)]]

我该怎么办?我需要将这些数据放在putdata()方法中 得到元组矩阵。

2 个答案:

答案 0 :(得分:1)

当我测试你的第一行时,我收到错误

In [156]: data=np.zeros((3,4,2),dtype= [[(0,0,0)],])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-156-9f6f75b73353> in <module>()
----> 1 data=np.zeros((3,4,2),dtype= [[(0,0,0)],])

TypeError: data type not understood

该表达式是否适合您?你让它听起来像它。如果不是,你应该清楚错误。

但是你用元组矩阵究竟是什么意思呢?只是显示

的东西
[[(0,0,0),(0,0,0),(0,0,0)],[(0,0,0),(0,0,0)]]

您提到putdata方法。你在说什么包?不是numpy

我可以创建一个像这样显示的结构数组

In [158]: np.zeros((2,2),dtype='i,i,i')
Out[158]: 
array([[(0, 0, 0), (0, 0, 0)],
       [(0, 0, 0), (0, 0, 0)]], 
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])


In [159]: print(np.zeros((2,2),dtype='i,i,i'))
[[(0, 0, 0) (0, 0, 0)]
 [(0, 0, 0) (0, 0, 0)]]

从技术上讲,这不包含元组,尽管它使用元组语法。将其转换为列表可能会更好。

In [160]: np.zeros((2,2),dtype='i,i,i').tolist()
Out[160]: [[(0, 0, 0), (0, 0, 0)], [(0, 0, 0), (0, 0, 0)]]

最后一个结果是一个嵌套列表 - 元组列表列表。

但内部元素是元组真的很重要吗?

In [179]: np.zeros((2,2,3),int)
Out[179]: 
array([[[0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0]]])

In [180]: np.zeros((2,2,3),int).tolist()
Out[180]: [[[0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0]]]

通常在Python列表和元组中是可以互换的。

我们需要了解有关putdata方法的更多信息。

===============

我猜测putdata是一种PIL方法。

在这种情况下,这有效:

In [240]: from PIL import Image

In [241]: im=Image.new('RGB',(10,10))    
In [243]: im.putdata(np.ones((100,),dtype='i,i,i').tolist())

im.putdata(np.ones((10,10),dtype='i,i,i').tolist())不起作用;看起来数据必须是一个单一的列表

[(0,0,0),(0,1,0), etc]

im.putdata([(0,1,0)]*100)也有效,因为它只是元组的简单列表复制。

答案 1 :(得分:0)

您可以创建一个NumPy array of zeros,将其拆分为3rd index,然后map将它们组合成循环理解,就像这样 -

split_zeros = np.split(np.zeros((5,3),dtype=int),[3],axis=0)
out = [map(tuple,item) for item in split_zeros]

示例运行 -

In [166]: split_zeros = np.split(np.zeros((5,3),dtype=int),[3],axis=0)

In [167]: [map(tuple,item) for item in split_zeros]
Out[167]: [[(0, 0, 0), (0, 0, 0), (0, 0, 0)], [(0, 0, 0), (0, 0, 0)]]