numpy结构数组没有形状信息?

时间:2015-04-14 13:53:28

标签: python-3.x numpy

为什么单行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])

1 个答案:

答案 0 :(得分:3)

简短回答:将参数ndmin=1添加到loadtxt来电。

长答案

形状为(),原因与使用loadtxt读取单个浮点值返回形状为()的数组相同:

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时,结构将定义数组中单个元素的字段。通常将这些字段视为" columns",但如果您始终将结构化数组视为它们的结构,那么结构化数组将更有意义:具有字段的结构数组。如果您的数据文件有两个行,则loadtxt返回的数组将是一个形状为(2,)的数组。也就是说,它是一个长度为2的一维数组。数组的每个元素都是一个结构,其字段由给定的dtype定义。当输入文件只有一行时,数组的形状为(1,),但loadtxt会将其压缩为形状为()的标量数组。

要强制loadtxt始终返回一维数组,即使存在单行数据,也要使用参数ndmin=1

例如,这里是结构化数组的dtype:

In [58]: dt = np.dtype([('x', np.float64), ('y', np.float64)])

使用该dtype读取一行。结果形状为()

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')])