Numpy,一个2行1列文件,loadtxt()返回1row 2列

时间:2013-05-30 13:45:02

标签: python numpy

2.765334406984874427e+00
3.309563282821381680e+00

该文件如上所示:2行,1列 numpy.loadtxt()返回

[ 2.76533441  3.30956328]

请不要告诉我在这种情况下使用array.transpose(),我需要一个真正的解决方案。提前谢谢!!

4 个答案:

答案 0 :(得分:5)

您始终可以使用reshape命令。单列文本文件作为1D数组加载,在numpy的情况下是行向量。

>>> a
array([ 2.76533441,  3.30956328])

>>> a[:,None]
array([[ 2.76533441],
       [ 3.30956328]])

>>> b=np.arange(5)[:,None]
>>> b
array([[0],
       [1],
       [2],
       [3],
       [4]])
>>> np.savetxt('something.npz',b)
>>> np.loadtxt('something.npz')
array([ 0.,  1.,  2.,  3.,  4.])
>>> np.loadtxt('something.npz').reshape(-1,1) #Another way of doing it
array([[ 0.],
       [ 1.],
       [ 2.],
       [ 3.],
       [ 4.]])

您可以使用尺寸数来检查。

data=np.loadtxt('data.npz')
if data.ndim==1: data=data[:,None]

或者

np.loadtxt('something.npz',ndmin=2) #Always gives at at least a 2D array.

虽然值得指出的是,如果你总是有一列数据numpy将始终将其作为一维数组加载。这更像是numpy数组的一个特性,而不是我相信的一个bug。

答案 1 :(得分:2)

如果您愿意,可以使用matrix从字符串中读取。让test.txt涉及内容。这是一个满足您需求的功能:

import numpy as np

def my_loadtxt(filename):
    return np.array(np.matrix(open(filename).read().strip().replace('\n', ';')))

a = my_loadtxt('test.txt')
print a

如果输入是列向量,则给出列向量。对于行向量,它给出行向量。

答案 2 :(得分:1)

您可能想要使用csv模块:

import csv
import numpy as np

reader = csv.reader( open('file.txt') )
l = list(reader)
a = np.array(l)

a.shape
>>> (2,1)

这样,无论文件中存在多少行/列,您都将获得正确的数组维度。

答案 3 :(得分:0)

我为loadtxt编写了一个包装器来执行此操作,类似于@petrichor的回答,但我认为matrix不能有字符串数据格式(可能是可以理解的)所以这样做如果您正在加载字符串(例如列标题),则该方法似乎不起作用。

def my_loadtxt(filename, skiprows=0, usecols=None, dtype=None):
    d = np.loadtxt(filename, skiprows=skiprows, usecols=usecols, dtype=dtype, unpack=True)
    if len(d.shape) == 0:
        d = d.reshape((1, 1))
    elif len(d.shape) == 1:
        d = d.reshape((d.shape[0], 1))
    return d