首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

【python的Img的数据结构】小弟我觉得这个数据的结构应该是个列表,但是感觉怪怪的

2013-03-25 
【python的Img的数据结构】我觉得这个数据的结构应该是个列表,但是感觉怪怪的本帖最后由 somebodykiss 于 20

【python的Img的数据结构】我觉得这个数据的结构应该是个列表,但是感觉怪怪的
本帖最后由 somebodykiss 于 2013-03-22 16:58:22 编辑 我是一个python刚入门的新手,刚刚学习过python的syntax,现在用python的一个图像处理类库SimpleCV。

在一个讲解piexl and image这个环节,官方文档说,要访问图像的某一确定部分,可以用类似于二维数组的方法。(原话是: For the Python aficionados, it is also possible to do cropping by directly manipulating
the two dimensional array of the image.)

但是对于下面这段话,我就有点费解了:
For example, img[start_x:end_x, start_y:end_y] provides a cropped image from (start_x, start_y) to (end_x, end_y).

从img[start_x:end_x, start_y:end_y]的语法结构来看,这是python中的一个slicing, 但是我查看了《Learning.Python》这本书中讲解list的这部分,说对于list slicing, 都是list[i:j]的形式,没有list[i:j, k:l]这种形式。

我在python的interpreter中,用列表的形式构造了下列的二维数组:
matrix = [ [1,2,3], [4,5,6], [7,8,9] ]
然后用matrix[0:2,0:2],试图访问一个2x2的子矩阵,但是在interpreter中提示说:
TypeError: list indices must be integers, not tuple

我寻思着可能SimpleCV中Image的数据结构可能不是用嵌套列表的方法来实现的类似2 dimension array。如果这样的话, 那么img[start_x:end_x, start_y:end_y]这种形式的数据结构可能会是怎么样子的?

谢谢。
[解决办法]
建议好好阅读文档,如果你用过numpy和scipy这2个包,对于这种slice应该不会陌生,这是类matlab的二维数组索引方式,在数值计算包numpy和scipy中有具体实现,ndarray或者ndimage.为了实现像matlab一样方便的的矩阵切割.
例如:

>>> import numpy
>>> a = numpy.ndarray((2,3))
>>> a
array([[  2.49208464e-306,  -3.13264791e-294,   6.73606550e-310],
       [  2.49208610e-306,   3.91957011e+202,   1.43575936e-308]])
>>> a[1:2,1:2]
array([[  3.91957011e+202]])
>>> a[1:,1:]
array([[  3.91957011e+202,   1.43575936e-308]])
>>>

大概翻了一下simplecv的网站,返现required package里面就包含numpy和scipy,估计Image这个类的内部数据保存用了上面的二维数组的概念,而非python的标准做法list的list,所以可以直接双下标切片.
[解决办法]
引用:
引用:
好像不用看numpy ,我试验了3.2 ,不知道是不是2.7是否一样


不仅list可以抛出异常,t 也可以的呀!

#我觉得还是你自己加空格的好
class t :
    def __init__(self):
        print('inited\n')

    def __getitem__(self,args):
        print('you want get a item of ',args)
        print('you give me a type:',type(args),"\n")
        if(type(args)==type((8,))):
            raise  TypeError('My list indices must be integers, str , object ,but not tuple') 

tt = t()

tt[1:3]

tt[1]

tt['a']

tt[t()]

tt[1:3,4:6]

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 


inited

you want get a item of  slice(1, 3, None)
you give me a type: <class 'slice'> 

you want get a item of  1
you give me a type: <class 'int'> 

you want get a item of  a
you give me a type: <class 'str'> 

inited

you want get a item of  <__main__.t object at 0x012EAFD0>
you give me a type: <class '__main__.t'> 

you want get a item of  (slice(1, 3, None), slice(4, 6, None))
you give me a type: <class 'tuple'> 

Traceback (most recent call last):
  File "C:\slic.py", line 21, in <module>
    tt[1:3,4:6]
  File "C:\slic.py", line 9, in __getitem__
    raise  TypeError('My list indices must be integers, str , object ,but not tuple')
TypeError: My list indices must be integers, str , object ,but not tuple
>>> 


(说明 :如果有人在2.6下测试不一样,那么你可以去看python的源码,或者。。。。。。我无话可说)

热点排行