NumPy结构化数组没有形状信息?

3
为什么单行numpy结构数组的形状未定义('()'),有什么常见的“解决方法”?
import io
fileWrapper = io.StringIO("-0.09469 0.032987 0.061009 0.0588")

a =np.loadtxt(fileWrapper,dtype=np.dtype([('min', (float,2) ), ('max',(float,2) )]), delimiter= " ", comments="#");
print(np.shape(a), a)

输出结果: () ([-0.09469, 0.032987], [0.061009, 0.0588])


在执行 a = np.loadtxt 后,print a 的结果是什么? - Mazdak
添加了上述输出 - Gabriel
这种不一致的错误行为会使代码语法混乱,即区分单行数组和更大的数组。 - Gabriel
()是形状信息 - 用于单个元素的0维数组。 - hpaulj
1个回答

3

简短回答: 在 loadtxt 调用中添加参数 ndmin=1

详细回答:

loadtxt 读取单个浮点值时返回形状为 () 的数组,因此形状为 ()。要解决这个问题,请在 loadtxt 调用中添加参数 ndmin=1

In [43]: a = np.loadtxt(['1.0'])

In [44]: a.shape
Out[44]: ()

In [45]: a
Out[45]: array(1.0)

默认情况下,loadtxt使用squeeze函数来消除返回的数组中微不足道的(即长度为1的)维度。在上面的示例中,这意味着结果是一个“标量数组”——一个形状为()的数组。
当您给loadtxt提供一个结构化的dtype时,该结构定义了数组的单个元素的字段。通常认为这些字段是“列”,但如果您始终将它们视为其本质:具有字段的结构数组,则结构化数组会更加合理。如果您的数据文件有两行,则loadtxt返回的数组将是一个形状为(2,)的数组。也就是说,它是一个长度为2的一维数组。数组的每个元素都是由给定的dtype定义字段的结构体。当输入文件只有一行时,数组的形状将为(1,),但loadtxt会将其压缩为一个形状为()的标量数组。
要强制loadtxt始终返回一维数组,即使只有一行数据,请使用参数ndmin=1
例如,这是一个用于结构化数组的dtype:
In [58]: dt = np.dtype([('x', np.float64), ('y', np.float64)])

使用该数据类型读取一行。结果的形状为()

In [59]: a = np.loadtxt(['1.0 2.0'], dtype=dt)

In [60]: a.shape
Out[60]: ()

使用ndmin=1可以确保即使输入只有一行,也会得到一个一维数组:

In [61]: a = np.loadtxt(['1.0 2.0'], dtype=dt, ndmin=1)

In [62]: a.shape
Out[62]: (1,)

In [63]: a
Out[63]: 
array([(1.0, 2.0)], 
      dtype=[('x', '<f8'), ('y', '<f8')])

请提供要翻译的英文内容。 - Gabriel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接