我该如何使用Numpy的vstack方法?

时间:2012-09-06 11:31:45

标签: python numpy

首先,这是代码的相关部分:

stokes_list = np.zeros(shape=(numrows,1024)) # 'numrows' defined earlier
for i in range(numrows):
    epoch_name = y['filename'][i] # 'y' is an array from earlier
    os.system('pdv -t {0} > temp.txt '.format(epoch_name)) # 'pdv' is a command from another piece of software - here I copy the output into a temporary file
    stokes_line = np.genfromtxt('temp.txt', usecols=3, dtype=[('stokesI','float')], skip_header=1)
    stokes_list = np.vstack((stokes_line,stokes_line))

所以,基本上,每次代码循环时,stokes_line从文件temp.txt中拉出其中一列(第4个),我希望它向{{1}添加一行} 每一次。

例如,如果第一个stokes_list

stokes_line

,第二个是

1.1 2.2 3.3  

然后4.4 5.5 6.6 将是

stokes_list

并将继续增长......

此刻它不起作用,因为我认为这一行:

1.1 2.2 3.3  
4.4 5.5 6.6  

不正确。它只堆叠2个列表 - 这是有意义的,因为我只有2个参数。我基本上想知道我是如何一次又一次地堆叠的。

非常感谢任何帮助! 如果需要,以下是temp.txt文件格式的示例:

stokes_list = np.vstack((stokes_line,stokes_line))

2 个答案:

答案 0 :(得分:40)

vstack一次又一次不好,因为它会复制整个数组。

为其创建一个普通的Python list.append,然后将其全部传递给np.vstack以创建一个新数组。

stokes_list = []
for i in xrange(numrows):
    ...
    stokes_line = ...
    stokes_list.append(stokes_line)

big_stokes = np.vstack(stokes_list)

答案 1 :(得分:8)

您已经知道stokes_list数组的最终大小,因为您知道numrows。所以看起来你不需要增长一个数组(这是非常低效的)。您可以在每次迭代时简单地分配正确的行。 只需通过以下方式替换您的最后一行:

stokes_list[i] = stokes_line

顺便说一句,关于你的非工作线,我认为你的意思是:

stokes_list = np.vstack((stokes_list, stokes_line))

您要将stokes_list替换为新值。