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