首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制genfromtxt输出为无向量

强制genfromtxt输出为无向量
EN

Stack Overflow用户
提问于 2013-01-18 20:21:55
回答 2查看 284关注 0票数 1

有没有办法强制genfromtxt输出这样的数据:(xx,1)在只加载一列数据的情况下?通常的形状是(xx,)。在我的例子中,xx可以是任意整数。

更新:下面是一个代码示例:

代码语言:javascript
复制
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。

实际上,文件名是通过一个变量给出的,如下所示:

代码语言:javascript
复制
filename = 'file_1000x10_' + '%02d' % ind.astype(int) + '.csv'

因此,在for循环中的每次迭代中,np.genfromtxt都会从另一个文件加载数据。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-18 22:23:21

我认为诀窍是reshape(-1, nbcols)你从np.genfromtxt得到的东西,所以你的赋值应该是这样的:

代码语言:javascript
复制
a[:, ind:ind + nbcols] = np.genfromtxt('file_1000x10.csv',
                                       usecols = range(nbcols)).reshape(-1, nbcols)

另外,循环遍历ind并每次都读取文件是不必要的。你可以像下面这样做一些高维的伏都教:

代码语言:javascript
复制
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

代码语言:javascript
复制
your_array.reshape(your_array.shape + (1,))

或等效的

代码语言:javascript
复制
your_array.reshape(-1, 1)

同样可以使用以下命令实现

代码语言:javascript
复制
your_array[..., np.newaxis]

或等效的

代码语言:javascript
复制
your_array[..., None]
票数 1
EN

Stack Overflow用户

发布于 2013-01-19 02:56:25

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

代码语言:javascript
复制
a[:, ind : ind + nbcols] = np.loadtxt('file_1000x10.csv', usecols=range(nbcols), ndmin=2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14398868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档