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

Store file contents of .npz file in array

我有多个 .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)

Link 一个 .npz 文件 here

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

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

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

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', recursive=True)
print("Landmarks size: ",len(entries))

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

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

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