1

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

4

2 回答 2

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]
于 2013-01-18T14:23:20.717 回答
1

如果您可以使用loadtxt而不是genfromtxt,并且如果您使用的是 numpy 1.6.0 或更高版本,则该ndmin参数允许您指定数组的(最小)维数。例如:

a[:, ind : ind + nbcols] = np.loadtxt('file_1000x10.csv', usecols=range(nbcols), ndmin=2)
于 2013-01-18T18:56:24.857 回答