我有一个循环读取文件直到到达结尾。在每次通过循环时,我提取一维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)'调整大小并得到我想要的数据。
答案 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)