问题描述
我有多个 .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)
解决方法
问题在于 (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