【问题标题】:how to create a matrix of tuples that is initialize with zeroes如何创建一个用零初始化的元组矩阵
【发布时间】: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() 方法中 得到元组的矩阵。

【问题讨论】:

    标签: python image numpy matrix


    【解决方案1】:

    您可以创建一个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)]]
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢!我的主要问题是我应该在 putdata 方法中使用平面列表。
      猜你喜欢
      • 1970-01-01
      • 2018-11-12
      • 2018-01-15
      • 2021-03-13
      • 2016-12-17
      • 2022-12-18
      • 2019-11-29
      • 1970-01-01
      • 2016-07-23
      相关资源
      最近更新 更多