当前位置: 首页 > 面试题库 >

在SVHN数据集中访问hdf5组的两种方式之间有什么区别?

孟昆
2023-03-14
问题内容

我需要读取SVHN数据集,并试图读取第一个图像的文件名。

我正在努力了解HDF5的结构,尤其是在了解SVHN数据集的层次结构/结构方面

这两种读取图像名称的方法有什么区别?

我在getName()函数定义中的此脚本中遇到了方法1 :https : //github.com/bdiesel/tensorflow-
svhn/blob/master/digit_struct.py

我尝试了hdf5格式文件,并尝试了方法2,同时尝试了显示相同结果的不同事物。

# Both these methods read the first character of the name of the 1st
# image in svhn dataset
f = h5py.File(path_to_svhn_dataset,'r')

# method 1 
f[f['digitStruct']['name'][0][0]].value

# method 2
f[f['digitStruct']['name'].value[0].item()].value[0][0]

第一个图像是文件名“ 1.png”的文件。上面提到的两种获取文件名第一个字符的方式都将使我们的int等效于ascii‘1’-> 49


问题答案:

首先,这两种方法的输出存在细微差异。
方法1:返回完整的数组(编码的文件名)
方法2:仅返回数组的第一个元素(字符)

让我们解构您的代码以了解您所拥有的。
第一部分处理h5py数据对象。

f['digitStruct']->返回h5py 对象
f['digitStruct']['name']->返回h5py 数据集 对象
f['digitStruct']['name'].name->返回 数据集 对象的名称(路径)

注:
/digitStruct/name数据集包含“对象引用”。每个数组条目都是一个指向另一个h5py对象(在本例中为另一个数据集)的指针。例如(用于描绘2个对象引用的空格):
f[ f['digitStruct']['name'][0][0] ]->返回在[0] [0]处引用的对象。
因此,外部f[ obj_ref ]对象的工作方式与其他对象引用一样。

在的情况下f['digitStruct']['name'][0][0],这是指向数据集的对象。/#refs#/b
换句话说,f['digitStruct']['name'][0][0]引用与以下对象相同的对象:
f['#refs#']['b']f['/#refs#/b']

对于h5py对象引用来说就这么多。
让我们继续使用 方法1 从此对象引用中获取数据。

f[f['digitStruct']['name'][0][0]].value->将整个/#refs#/b数据集作为NumPy数组返回。

但是,dataset.value已弃用,并且首选使用NumPy索引,例如:(
f[f['digitStruct']['name'][0][0]][:] 获取整个数组)

注意:这两个都返回整个编码字符数组。此时,获得的名称是Python和NumPy功能。使用此命令以字符串形式返回文件名:
f[f['digitStruct']['name'][0][0]][:].tostring().decode('ascii')

现在,让我们解构用于 方法2 的对象引用。

f['digitStruct']['name'].value
->将整个/digitStruct/name数据集作为NumPy数组返回。它具有13,068行,带有对象引用

f['digitStruct']['name'].value[0] ->是第一行

f['digitStruct']['name'].value[0].item() ->将数组元素复制到python标量

因此,所有这些都指向同一个对象:
方法1:f['digitStruct']['name'][0][0]
方法2:f['digitStruct']['name'].value[0].item()
并且与该示例相同f['#refs#']['b']或相同f['/#refs#/b']

像方法1一样,获取字符串是Python和NumPy功能

f[f['digitStruct']['name'].value[0].item()][:].tostring().decode('ascii')

是的,对象引用很复杂....
我的建议:
而不是使用NumPy索引从对象中提取NumPy数组.value(如上面的修改方法1所示)。

完整性示例代码。中间的打印语句用来显示正在发生的事情。

import h5py

# Both of these methods read the name of the 1st
# image in svhn dataset
f = h5py.File('test_digitStruct.mat','r')
print (f['digitStruct'])
print (f['digitStruct']['name'])
print (f['digitStruct']['name'].name)

# method 1
print('\ntest method 1')
print (f[f['digitStruct']['name'][0][0]])
print (f[f['digitStruct']['name'][0][0]].name)
#  both of these get the entire array / filename:
print (f[f['digitStruct']['name'][0][0]].value)
print (f[f['digitStruct']['name'][0][0]][:]) # same as .value above
print (f[f['digitStruct']['name'][0][0]][:].tostring().decode('ascii'))

# method 2
print('\ntest method 2')
print (f[f['digitStruct']['name'].value[0].item()]) 
print (f[f['digitStruct']['name'].value[0].item()].name)

# this only gets the first array member / character:
print (f[f['digitStruct']['name'].value[0].item()].value[0][0])
print (f[f['digitStruct']['name'].value[0].item()].value[0][0].tostring().decode('ascii'))
#  this gets the entire array / filename:
print (f[f['digitStruct']['name'].value[0].item()][:])
print (f[f['digitStruct']['name'].value[0].item()][:].tostring().decode('ascii'))

每个方法的最后2条打印语句的输出相同:

[[ 49]
 [ 46]
 [112]
 [110]
 [103]]
1.png


 类似资料:
  • 问题内容: 我刚刚发现了HDF5格式,正在考虑使用它来存储分布在Java应用程序服务器群集上的3D数据。我发现有几种可用于Java的实现,并且想知道它们之间的区别: Java HD5接口(JHI5) HDF组本身的Java包装器。 JHDF5(用于Java的HDF5) 多年冻土 Nujan:纯Java NetCDF4和HDF5编写器(无法读取HDF5) 最重要的是,我想知道: 涵盖了多少本机API

  • 问题内容: 在Java中,我可以通过以下方式初始化具有预定义内容的数组: 或通过: 本质上,这两种方式之间有什么区别吗?它们在Java中是否完全相同?哪种方法更好,为什么呢? 问题答案: 就您而言,没有区别。 当您不将变量分配给变量并进行内联创建时,将会有所 不同。 例如,考虑有一个方法,它以数组作为参数。 您的情况: 现在在其他情况下调用它时可以看到区别。

  • 我正在浏览微软的Rust教程,它是关于 实现函数,以便返回对插入向量中的值的引用 这里给出了解决方案,但它与我的不同之处在于它使用了 除了返回类型之外,我的和标准解决方案之间的另一个区别是,我只是简单地返回了参数,而标准解决方案使用复杂方式)。 我想知道我的解决方案是否有任何问题,本教程采取了另一种方式? 虽然@Masklin为我的问题提供了一个很好的答案,但它有点特定于我给出的示例,但没有直接解

  • 问题内容: 我试图在Web应用程序中验证公司名称,并且使用此正则表达式模式 上述模式将拒绝值 10004 Estates Limited 但是如果我提出0-9,那么模式变成 然后就可以了。正则表达式和模式是新手,但我知道我应该使用更多它,因此我想对此进行澄清。谢谢。 问题答案: 是字符类中的一个特殊字符,因此是歧义的,可能会赋予和和含义,因此本质上是字符。 要在字符类中包含连字符减号,您必须将其转

  • 我仍在努力理解最近推出的Spark数据集的全部功能。 是否有关于何时使用RDD和何时使用数据集的最佳实践? Databricks在他们的公告中解释说,通过使用数据集,可以实现运行时和内存的惊人减少。尽管如此,据称数据集的设计“与现有RDD API协同工作”。 这仅仅是对向下兼容性的引用,还是有人更愿意在数据集上使用RDD的场景?

  • 本文向大家介绍JS访问对象两种方式区别解析,包括了JS访问对象两种方式区别解析的使用技巧和注意事项,需要的朋友参考一下 可以使用下面两种方式访问对象的属性和方法 1.对象名.属性名    对象名.方法名() 2.对象名["属性名"]   对象名"方法名" 对于已经存在的属性和方法,用.和用[]得到的结果一致、 对于不存在(未定义)的属性和方法,用.会创建这个新的属性或方法,而用[]的方式访问不会创