将单行/行向量作为列表加载的numpy.loadtxt方法

10

I have a data file with only one line like:

 1.2  2.1  3.2

我使用numpy版本1.3.0的loadtxt进行加载。
 a,b,c = loadtxt("data.dat", usecols(0,1,2), unpack=True)

输出结果是浮点数而不是类数组。
 a = 1.2

我预计这应该是:
 a = array([1.2])

如果我读取一个有多行的文件,它是可以工作的。

3个回答

5

只需使用numpy的内置loadtxt参数ndmin即可。

a,b,c=np.loadtxt('data.dat',ndmin=2,unpack=True)

输出

a=[1.2]

在这种情况下,您应该向已接受的答案提交一个编辑,并明确说明这是6年后的更新。请注意,ndim是在numpy 1.6中实现的,而OP使用的不是这个版本。 - FabienP
这个ndmin参数救了我的命,这就是我一直在寻找的解决这种问题的方法。 - CrmXao

2
当加载数组时,您获得了一个一维数组。当您对其进行拆包时,它会变成一组数字,即没有维度的数组。这是因为当您拆包一个数组时,它的维数会减少一个。从一个一维数组开始,它最终会变成一个简单的数字。
如果测试a的类型,它不是浮点数,而是numpy.float,具有数组的所有属性,但形状为空元组。所以它是一个数组,只是没有被表示成一个数组。
如果您需要一个只有一个元素的一维数组,则最简单的方法是在拆包之前重新调整您的数组的形状:
#note the reshape function to transform the shape
a,b,c = loadtxt("text.txt").reshape((-1,1))

这将会给你期望的结果。发生的事情是将其重塑为二维数组,这样当你解压缩它时,维度数就会降到一维。

编辑:

如果你需要它在多维数组上正常工作,并在读取一维数组时保持一维,我认为最好的方法是使用loadtxt正常读取,然后在第二阶段重塑数组,如果它们是纯数字,则将其转换为单一维度。

a,b,c = loadtxt("text.txt",unpack=True)
for e in [a,b,c]
    e.reshape(e.shape if e.shape else (-1,))

如果我将其用于数据文件并且有多行,这会导致错误。 - Thiru
你只需要根据你的数据调整reshape函数。但是如果你有一个多维矩阵,你应该不会遇到非维数组的问题,对吧?也许你应该在问题中加入更多的规格说明... - EnricoGiampieri
正如我在问题中提到的那样,如果不使用reshape,它可以处理具有多行的文件。如果使用reshape,它只能处理单行文件。我需要一个通用命令,可以读取单行文件和多行文件,并将输出作为数组返回。 - Thiru

0

不使用reshape的简单方法是显式地将列表转换类型

 a,b,c = loadtxt("data.dat", usecols(0,1,2), unpack=True)
 a,b,c = (a,b,c) if usi.shape else ([a], [b], [c])

这比reshape快!


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