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