2.765334406984874427e+00
3.309563282821381680e+00
该文件如上所示:2 行,1 列 numpy.loadtxt() 返回
[ 2.76533441 3.30956328]
请不要告诉我在这种情况下使用 array.transpose(),我需要一个真正的解决方案。先感谢您!!
您始终可以使用 reshape 命令。单列文本文件加载为一维数组,在 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 数组的一个特性,而不是我认为的错误。
如果你喜欢,你可以使用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
如果输入是列向量,它会给出列向量。对于行向量,它给出行向量。
您可能想要使用 csv 模块:
import csv
import numpy as np
reader = csv.reader( open('file.txt') )
l = list(reader)
a = np.array(l)
a.shape
>>> (2,1)
这样,无论文件中存在多少行/列,您都将获得正确的数组维度。
我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