【发布时间】:2016-10-14 01:12:35
【问题描述】:
我正在创建一张图片,我使用 numpy. 我尝试了类似的方法,但出现错误 数据 = 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() 方法中 得到元组的矩阵。
【问题讨论】:
我正在创建一张图片,我使用 numpy. 我尝试了类似的方法,但出现错误 数据 = 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() 方法中 得到元组的矩阵。
【问题讨论】:
您可以创建一个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)]]
【讨论】:
当我测试你的第一行时,我得到一个错误
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) 也可以,因为它只是一个简单的元组列表复制。
【讨论】: