Python-Numpy 3D数组-连接问题
我有一个包含46个条目的txt文件,如下所示-Python-Numpy 3D数组-连接问题,python,numpy,Python,Numpy,我有一个包含46个条目的txt文件,如下所示- 2020-05-24T10:57:12.743606#[0.0, 0.0, 0.0653934553265572, 0.0, 1.0, 0.0] 2020-05-24T10:57:12.806380#[0.0, 0.0, 0.0, 0.0, 1.0, 0.0] 2020-05-24T10:57:12.869022#[0.0, 0.0, 0.0, 0.0, 1.0, 0.0] 第一个参数是拍摄的相机图像的时间戳。对于每个时间戳,有3个RGB图像 我
2020-05-24T10:57:12.743606#[0.0, 0.0, 0.0653934553265572, 0.0, 1.0, 0.0]
2020-05-24T10:57:12.806380#[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]
2020-05-24T10:57:12.869022#[0.0, 0.0, 0.0, 0.0, 1.0, 0.0]
第一个参数是拍摄的相机图像的时间戳。对于每个时间戳,有3个RGB图像
我的目标是沿着通道轴(轴=2)连接它们。图像尺寸为70x320x3。因此,所需的输出是46x70x320x9
我需要等待,直到所有3个图像都被识别,然后将它们附加到一个列表中,并将其馈送到numpy数组。我失败了,因为在concate之前,我得到的输出维度是46x138(对于append中的3个图像)x70x320x346x138x70x320x3
。使用axis=2或3实现连接时不起作用
如何从中获取46x70x320x9
代码-
with open("train.txt", 'r') as f:
data = f.readlines()[:]
images = []
image_concat = []
labels = []
for row in data:
for camera in ['center', 'left', 'right']:
img_id, label = row.strip("\n").split("#")
img_path = os.path.join(IMG_PATH, '{}-{}.jpg'.format(camera, img_id))
image = cv2.imread(img_path)
images.append(image)
if camera == 'right':
image_concat.append(images)
X_data = np.array(image_concat)
print(X_data.shape)
参考链接-
请帮忙。任何帮助都将不胜感激。谢谢。这里是一个使用虚拟数据的实现
collect = []
for i in range(46):
#create dummy arrays, simulate list of 3 RGB images
a = [np.zeros((70,320,3)) for b in range(3)]
# a[0].shape: (70,320,3)
#concatenate along axis 2
b = np.concatenate(a, axis=2)
# b.shape: (70,320,9)
#create new axis in position zero
b = b[np.newaxis, ...]
# b.shape : (1,70,320,9)
collect.append(b)
output = np.concatenate(collect, axis=0)
output.shape
(46, 70, 320, 9)
编辑:
在第一次回答之后,我发现问题出在文本文件的输出列表上。它一下子就把所有的线都倒了。经过几次尝试,我最终使用了csv.reader
,这让事情变得简单多了。在那之后,我扩展了他的第二个答案,完成了任务
with open('train.txt', 'r') as f:
lines = f.readlines()
data = csv.reader(lines, delimiter = "#")
for count, index in enumerate(data):
img_id = index[0]
label = [float(item) for item in index[1][1:-1].split(",")]
从此处标记解决方案--
之后,它基本上是在使用答案
此链接帮助我选择了csv阅读器--感谢您将其分解。我能够理解这个新的坐标轴对我的帮助。在我的例子中,当我读取文本文件时,我会得到所有的行,这将导致所有138个文件路径。我很难将它缩小到每3行进行第一次连接。我需要弄清楚怎么做。非常感谢。你的崩溃不仅帮助我学习,还让我更好地理解了这个问题。我不得不做一些改变。完成了,很抱歉再次打扰你。我将逻辑扩展到一个更大的数据集,它有110000个时间戳,在图像中有3倍于它的时间戳,脚本崩溃时显示了一条“总线错误(内核转储)”消息。我看不到内存或cpu使用率出现峰值。但是,我认为使用字典会导致太多的内容留在持久性内存中。还有其他方法解决这个问题吗?@Deepak如果我理解正确,你想创建一个形状为(110000,70320,9)的数组。此对象的大小为165 gb。我建议您改变策略,使用更小的数据包。您可以一次加载和处理较小的块。更改了我的逻辑-使用列表而不是字典。将一个包含3个图像的列表附加到一个新列表中,对该列表执行连接,然后将该列表附加到另一个列表中,并删除每个迭代的3个图像列表。解决了内存问题。
with open('train.txt', 'r') as f:
lines = f.readlines()
data = csv.reader(lines, delimiter = "#")
for count, index in enumerate(data):
img_id = index[0]
label = [float(item) for item in index[1][1:-1].split(",")]