2013-01-18 40 views
1

有沒有辦法強制genfromtxt輸出形狀的數據:(xx,1)在只有一列數據加載的情況下? 通常的形狀是(xx,)。 xx在我的例子中可以是任何整數。強制genfromtxt輸出到無向量

更新: 這裏是代碼的示例:

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負荷數據。

回答

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[..., None] 
+0

您對重塑的建議是一個很好的解決方案。 – user1850133

1

來實現。如果你可以用loadtxt代替genfromtxt,如果你使用的是1.6.0或更高版本的numpy的,在ndmin說法允許您指定數組的維數(最小)。例如:

a[:, ind : ind + nbcols] = np.loadtxt('file_1000x10.csv', usecols=range(nbcols), ndmin=2)