2016-06-13 66 views
2

我正在创建一张图片并使用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()方法 中。

回答

0

您可以创建一个NumPy array of zeros,在3rd index拆分,然后map他们与循环comrehension元组,像这样 -

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)]] 
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的方法。

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

我从一个搜索是putdataPIL方法猜测。

在这种情况下,这个工程:

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)也适用,因为它只是元组的简单列表复制。

+0

谢谢!我的主要问题是我应该在putdata方法中使用一个平面列表。 – kipatbarzel1