在只加载一列数据的情况下,有没有办法强制genfromtxt输出形状为:(xx,1)的数据? 通常的形状是(xx,)。 我的例子中的xx可以是任何整数。
更新: 这是一个代码示例:
import numpy as np
a = np.zeros([1000, 10])
nbcols = 1
for ind in range(0, 10, nbcols)
a[:, ind : ind + nbcols] = np.genfromtxt('file_1000x10.csv', usecols = range(nbcols))
这段代码仅适用于nbcols> = 2;假设nbcols是一个整数c [1,10]。 是否有一个解决方案,使其适用于nbcols = 1而不添加if语句。
事实上我简化了这篇文章的原始代码,但这不会影响我的问题的答案。 实际上,文件名是通过变量给出的,如下所示:
filename = 'file_1000x10_' + '%02d' % ind.astype(int) + '.csv'
因此,在for循环的每次迭代中,np.genfromtxt都会从另一个文件中加载数据。
答案 0 :(得分:1)
我认为诀窍是reshape(-1, nbcols)
从np.genfromtxt
获得的内容,因此您的作业应如下所示:
a[:, ind:ind + nbcols] = np.genfromtxt('file_1000x10.csv',
usecols = range(nbcols)).reshape(-1, nbcols)
另外,在ind
上循环,每次都不需要读取文件。你可以按如下方式做一些更高维度的伏都教:
import numpy as np
from StringIO import StringIO
def make_data(rows, cols) :
data = ((str(k + cols * j) for k in xrange(cols)) for j in xrange(rows))
data = '\n'.join(map(lambda x: ' '.join(x), data))
return StringIO(data)
def read_data(f, rows, cols, nbcols) :
a = np.zeros((rows, (cols + nbcols - 1) // nbcols, nbcols))
a[...] = np.genfromtxt(f, usecols=range(nbcols)).reshape(-1, 1, nbcols)
return a.reshape(rows, -1)[:, :cols]
>>> read_data(make_data(3, 6), 3, 6, 2)
array([[ 0., 1., 0., 1., 0., 1.],
[ 6., 7., 6., 7., 6., 7.],
[ 12., 13., 12., 13., 12., 13.]])
>>> read_data(make_data(3, 6), 3, 6, 1)
array([[ 0., 0., 0., 0., 0., 0.],
[ 6., 6., 6., 6., 6., 6.],
[ 12., 12., 12., 12., 12., 12.]])
>>> read_data(make_data(3, 6), 3, 6, 4)
array([[ 0., 1., 2., 3., 0., 1.],
[ 6., 7., 8., 9., 6., 7.],
[ 12., 13., 14., 15., 12., 13.]])
原始回答
您可以使用以下内容将大小为1的额外维度添加到your_array
your_array.reshape(your_array.shape + (1,))
或等效的
your_array.reshape(-1, 1)
可以实现同样的目标
your_array[..., np.newaxis]
或等效的
your_array[..., None]
答案 1 :(得分:1)
如果您可以使用loadtxt
而不是genfromtxt
,并且如果您使用的是numpy版本1.6.0或更高版本,则ndmin
参数允许您指定(最小)数字数组的维数。 E.g:
a[:, ind : ind + nbcols] = np.loadtxt('file_1000x10.csv', usecols=range(nbcols), ndmin=2)