有没有办法强制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是一个整数c1,10。有没有一个解决方案可以让它在不添加if语句的情况下适用于nbcols =1。
实际上,文件名是通过一个变量给出的,如下所示:
filename = 'file_1000x10_' + '%02d' % ind.astype(int) + '.csv'因此,在for循环中的每次迭代中,np.genfromtxt都会从另一个文件加载数据。
发布于 2013-01-18 22:23:21
我认为诀窍是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-19 02:56:25
如果可以使用loadtxt而不是genfromtxt,并且使用的是1.6.0或更高版本的numpy,则ndmin参数允许您指定数组的(最小)维数。例如:
a[:, ind : ind + nbcols] = np.loadtxt('file_1000x10.csv', usecols=range(nbcols), ndmin=2)https://stackoverflow.com/questions/14398868
复制相似问题