Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-Numpy 3D数组-连接问题_Python_Numpy - Fatal编程技术网

Python-Numpy 3D数组-连接问题

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图像 我

我有一个包含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图像

我的目标是沿着通道轴(轴=2)连接它们。图像尺寸为70x320x3。因此,所需的输出是46x70x320x9

我需要等待,直到所有3个图像都被识别,然后将它们附加到一个列表中,并将其馈送到numpy数组。我失败了,因为在concate之前,我得到的输出维度是46x138(对于append中的3个图像)x70x320x3
46x138x70x320x3
。使用
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(",")]