python - 在 Python 中将矩阵列表转换为仅一个 2D 矩阵
问题描述
我有一个 3960 个矩阵的列表,它只是 3960 个图像的 SIFT 描述符。这应该会导致矩阵列表的行数未知(这当然取决于图像)和 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))
根据此代码, sift_keypoints 形状为 (1,3960),这当然不是我想要的。如何在 2D 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)
解决方案
解决方案使用np.row_stack
假设l
是您的形状的 Numpy 数组列表(n, 128)
。
假设m
是总行数:对象是将所有对象堆叠起来,创建一个形状为 的矩阵(m, 128)
。
我们可以使用 Numpy 进行如下操作row_stack
:
result = np.row_stack(l)
推荐阅读
- node.js - 上传到 S3 的节点 Js 错误:TypeError [ERR_INVALID_ARG_TYPE]
- firebase - 点动态Firebase数据库
- ruby-on-rails - 设计范围成员路由问题
- android - 在没有通知的情况下不经常更新位置?
- c - C - 有没有办法读取用户输入的单个字符,而不是将其余字符“下推”到下一个输入请求?
- java - JSOUP .attr() 方法不从工作 html 中提取数据
- ios - 为什么我的控制台 po 没有给出错误但相同的代码行使应用程序崩溃
- java - 使用 java 映射一些名称和值
- node.js - 如何将 gulp watch 脚本转换为 gulp 4
- apache-spark - 如何将 Spark 驱动程序日志发送到历史服务器?(独立模式)