为什么删除此源文件中的逗号会导致 HDF5 文件中出现标量数据?

Why does removing a comma in this source file result in a scalar data in the HDF5 file?

 f = h5.File("image_data.h5", 'w')
 f["horizontal_min"] = horizontal_min,
 f["horizontal_max"] = horizontal_max,
 f["vertical_min"] = vertical_min,
 f["vertical_max"] =  vertical_max,

结果

horizontal_max           Dataset {1}
horizontal_min           Dataset {1}
vertical_max             Dataset {1}
vertical_min             Dataset {1}

但是如果每行末尾的逗号被删除,如(从 h5ls 输出):

 f = h5.File("image_data.h5", 'w')
 f["horizontal_min"] = horizontal_min
 f["horizontal_max"] = horizontal_max
 f["vertical_min"] = vertical_min
 f["vertical_max"] =  vertical_max

我得到以下信息(h5ls 的输出):

  horizontal_max           Dataset {SCALAR}
  horizontal_min           Dataset {SCALAR}
  vertical_max             Dataset {SCALAR}
  vertical_min             Dataset {SCALAR}

请注意,数据从 Dataset {1} 更改为 {SCALAR}。注意逗号不会改变类型,如下所示:

  In [3]: type(5.0,)
  Out[3]: float

  In [4]: type(5.0)
  Out[4]: float

为什么会发生这种变化?

在交互式 ipython 会话中:

In [66]: 1,                                                                                               
Out[66]: (1,)
In [67]: 1                                                                                                
Out[67]: 1

加上逗号,值为tupleh5py将保存为一维数组。没有逗号它是一个标量。

在Python中逗号,是tuple语法的一部分;比 () 更重要。这不是多余的行结尾。 (; 是一个可选的行结束符)。

上次测试的正确方法:

In [71]: x=1,                                                                                             
In [72]: type(x)                                                                                          
Out[72]: tuple
In [73]: x=1                                                                                              
In [74]: type(x)                                                                                          
Out[74]: int

type(1,) 中,逗号是参数元组的一部分。 type 接受 1 或 3 个参数。

type(object_or_name, bases, dict)