在numpy中添加数组

时间:2014-09-09 19:20:19

标签: python arrays numpy

我有一个循环读取文件直到到达结尾。在每次通过循环时,我提取一维numpy数组。我想将这个数组附加到2D方向的另一个numpy数组。也就是说,我可能会读到某种形式的内容

x = [1,2,3]

我希望将其附加到

形式的内容中
z = [[0,0,0],
     [1,1,1]]

我知道我可以简单地z = numpy.append([z],[x],axis = 0)来实现我想要的结果

z = [[0,0,0],
     [1,1,1],
     [1,2,3]]

我的问题来自这样一个事实:在第一次循环中,我还没有任何东西要附加,因为第一个数组读入是2D数组的第一行。我不想写一个if语句来处理第一种情况,因为那很难看。如果我使用列表,我可以在循环之前简单地进行z = [],每次我在数组中读取时,只需执行z.append(x)即可获得所需的结果。但是我无法在numpy中找到类似的程序。我可以创建一个空的numpy数组,但是我不能按照我想要的方式添加它。有人可以帮忙吗?我有意义吗?

编辑:

经过一些更多的研究后,我发现了另一种技术上可以做我想要的解决方法,尽管我认为我会选择@Roger Fan给出的解决方案,因为numpy追加非常缓慢。我在这里张贴它只是为了它在那里。

我仍然可以在循环开始时定义z = []。然后用`np.append(z,x)追加我的数组。这最终会给我一些像

这样的东西
z = [0,0,0,1,1,1,1,2,3]

然后,因为我读入的所有数组都具有相同的大小,所以在循环之后我可以简单地用`np.resize(n,m)'调整大小并得到我想要的数据。

2 个答案:

答案 0 :(得分:3)

不要这样做。使用例如numpy.genfromtext()

将整个文件读入一个数组

使用这一个数组,您可以遍历行,循环遍历列,并使用切片执行其他操作。

或者,您可以创建常规列表,将大量数组附加到该列表,最后使用numpy.array(list_of_arrays)从列表生成所需数组,或者为了更多控制,numpy.vstack(list_of_arrays)

第二种方法的想法是“延迟数组创建”:首先查找并组织数据,然后创建一次所需的数组,已经是最终形式。

答案 1 :(得分:1)

正如@heltonbiker在他的回答中提到的,np.genfromtext之类的东西将是最符合你需求的方式。否则,我建议阅读this question关于附加到numpy数组的答案。基本上,numpy数组附加非常慢,应该尽可能避免。有两个更好(更快,约20倍)的解决方案:

如果您事先知道长度,可以预先分配阵列并分配给它。

length_of_file = 5000
results = np.empty(length_of_file)
with open('myfile.txt', 'r') as f:
    for i, line in enumerate(f):
        results[i] = processing_func(line)

否则,只需保留列表或数组列表,并将其一次性转换为numpy数组。

results = []
with open('myfile.txt', 'r') as f:
    for line in f:
        results.append(processing_func(line))
results = np.array(results)