【问题标题】:Store file contents of .npz file in array [closed]将.npz文件的文件内容存储在数组中[关闭]
【发布时间】:2021-07-06 07:48:59
【问题描述】:

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

【问题讨论】:

  • "bbox".format(k) 应该做什么?
  • entries[k] for k in entries 如果entries 是一个列表,这没什么意义,你的意思是entries吗?
  • 我通过glob.glob访问的所有.npz文件
  • @mkrieger1 我试过了,只打印了以下{'bbox': 'BIWILANDMARKS\\9\\frame_00884_info.npz'}
  • 您到底希望得到什么?

标签: python arrays glob


【解决方案1】:

问题在于这部分(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])}

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

【讨论】:

  • 我尝试了您的解决方案,但是当我 print(d) 得到的只是:{'bbox': 'BIWILANDMARKS\\24\\frame_00622_info.npz'} 我期望列出包含 4 个数组值的 'bbox' 的值。例如 'bbox[0]' 将有 [23 45 78 100]bbox[1], bbox[2].. 也是如此 我想让它们彼此列出
  • 你能告诉我更多细节吗,.npz 文件包含什么?
  • .npz 文件包含三个文件,其中之一是 bbox。以下代码仅打印第一个文件的内容data = np.load('BIWILANDMARKS/1/frame_00004_info.npz') print(data['bbox']),并从中得到[299 237 87 84]。我想将该数组和所有其他类似的数组从其他 .npz 文件中保存在一个大数组中。
  • 我为 2 个 .npz 文件添加了 Gdrive 链接
  • 我已根据您的需要进行了编辑。
【解决方案2】:

你的代码有两个问题:

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

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

从你在 cmets 中给出的解释看来你想这样做:

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

或者和字典推导一样:

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

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

【讨论】:

  • 不,我也不需要使用文件名。但感谢您按要求完成以下工作:for filename in entries[0:1]: d = np.load(filename)['bbox'] 我想知道是否有一种方法可以让我作为一个班轮做到这一点?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2010-11-07
    相关资源
    最近更新 更多