将 .npz 文件的文件内容存储在数组中

问题描述

我有多个 .npz 文件,我正在使用 glob.glob 访问每个文件在这些 .npz 文件中的每一个中,我都有一个名为 bBox文件,其中包含 4 个数组值。我想将每个 bBox 存储在一个大数组中,但是在运行第 4 行时出现此错误TypeError: list indices must be integers or slices,not str。有没有其他方法可以解决我需要完成的任务?

import glob 

entries = glob.glob('BIWILANDMARKS/*/*.npz',recursive=True)
print("Landmarks size: ",len(entries))

d = dict(zip(("bBox".format(k) for k in entries),(entries[k] for k in entries)))
print(d)

一个 .npz 文件链接 here

解决方法

问题在于 (entries[k] for k in entries) 部分,它期望 k 是索引,即 int 类型,但它实际上是 entries 数组中的一个项目。

更具体地说,您将 entries 数组的一项作为索引传递给 entries 数组。

对于链接中给定的文件,我们可以这样写

import glob 
import numpy as np

entries = glob.glob('frame_*_info.npz',recursive=True)
print("Landmarks size: ",len(entries))

d = {f'bbox[{k}]':np.load(entries[k])['bbox'] for k in range(len(entries))}
print(d)

输出是,

Landmarks size:  2
{'bbox[0]': array([299,237,87,84]),'bbox[1]': array([299,236,86,84])}

想想,这就是你所期望的!

,

您的代码中有两个问题:

  • "bbox".format(k) 始终是字符串 "bbox",因此 dict(zip(("bbox".format(k) for k in ...),...)) 创建的字典将只有 1 个条目,键为 "bbox"

  • 如果 entries 是一个字符串列表(由 glob 返回),那么 entries[k] for k in entries 会给出您观察到的错误,因为 k 是其中之一字符串,不能用作索引。

从您在评论中给出的解释来看,您似乎想这样做:

d = {}
for filename in entries:
    data = np.load(filename)
    d[filename] = data['bbox']

或者和字典理解一样:

d = {filename: np.load(filename)['bbox'] for filename in entries}

但是,我不太清楚您是否真的想使用文件名作为字典中的键,或者其他不同的东西。

,

提供的两个答案都是很好的解决方案。但是,如果有人只需要获取数组值。可以通过以下方式实现它:

import glob 

entries = glob.glob('BIWILANDMARKS/*/*.npz',len(entries))

file = []
for f in entries:     
    data = np.load(f)['bbox']
    file.append(data)

如果您打印出前十个值 print(file),您将获得以下内容: [array([299,array([299,85]),array([300,85])]

这样我就可以从任何数组中调用任何值。例如:我需要第二个数组中的第二个值:print(file[1][1]) 打印出 236