代码之家  ›  专栏  ›  技术社区  ›  mad

在python中将矩阵列表转换为一个二维矩阵

  •  0
  • mad  · 技术社区  · 6 年前

    我有一个3960个矩阵的列表,它只是3960个图像的筛选描述符。这将产生一个矩阵列表,其中包含未知数量的行(当然,这取决于图像)和128列(来自SIFT描述符)。我试图把这个列表放在一个二维矩阵中,其中行数是这些矩阵的行数和128列的总和,但是我不能这样做。这是我的代码:

    sift_keypoints = []
    
    #read images from a text file
    with open(file_images) as f:
        images_names = f.readlines()
        images_names = [a.strip() for a in images_names]
    
        for line in images_names:
            print(line)
            #read image
            image = cv2.imread(line,1)
            #Convert to grayscale
            image =cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
            #SIFT extraction
            sift = cv2.xfeatures2d.SIFT_create()
            kp, descriptors = sift.detectAndCompute(image,None)
            #appending sift keypoints to a list
            sift_keypoints.append(descriptors)
    
            #here is what I've tried
            sift_keypoints = np.asmatrix(np.asarray(sift_keypoints))
    

    根据这段代码,筛选关键点的形状是(13960),这当然不是我想要的。如何在二维numpy数组中转换此列表?

    编辑 下面的代码中有一个简单的例子说明了我的问题

    #how to convert this list to a matrix with shape (412,128)?
    import numpy as np
    x=np.zeros((256,128))
    y=np.zeros((156,128))
    list=[]
    list.append(x)
    list.append(y)
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Paul Panzer    6 年前

    使用 np.concatenate :

    >>> from pprint import pprint
    >>> import numpy as np
    >>> 
    >>> a = [np.full((2, 3), i) for i in range(3)]
    >>> pprint(a)
    [array([[0, 0, 0],
           [0, 0, 0]]),
     array([[1, 1, 1],
           [1, 1, 1]]),
     array([[2, 2, 2],                                                                                                  
           [2, 2, 2]])]                                                                                                 
    >>> np.concatenate(a, axis=0)                                                                                       
    array([[0, 0, 0],                                                                                                   
           [0, 0, 0],                                                                                                   
           [1, 1, 1],                                                                                                   
           [1, 1, 1],                                                                                                   
           [2, 2, 2],                                                                                                   
           [2, 2, 2]])                                                                                                  
    
        2
  •  3
  •   Luca Cappelletti    6 年前

    解决方案使用 np.row_stack

    假设 l 是你的形状的麻木数组列表吗? (n, 128) .

    假设 m 是行的总数:对象是堆叠所有对象并创建形状的矩阵 (m, 128) .

    我们可以使用numpy进行如下操作 row_stack :

    result = np.row_stack(l)