强制genfromtxt输出到无向量

时间:2013-01-18 12:21:55

标签: python numpy genfromtxt

在只加载一列数据的情况下,有没有办法强制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都会从另一个文件中加载数据。

2 个答案:

答案 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)