繁体   English   中英

在numpy中追加数组

[英]Appending arrays in 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数组,但随后无法按照我想要的方式附加到它。 有人可以帮忙吗? 我说得通吗

编辑:

经过更多研究后,我发现另一个解决方法在技术上可以实现我想要的功能,尽管鉴于numpy追加非常慢,我认为我会使用@Roger Fan提供的解决方案。 我将其发布在此处,以便将其发布。

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

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

然后,由于我读取的所有数组的大小都相同,因此在循环之后,我可以简单地使用“ np.resize(n,m)”调整大小并得到我想要的。

不要这样 使用例如numpy.genfromtext()将整个文件读取为一个数组。

使用这个数组,您可以在行上循环,在列上循环以及使用切片执行其他操作。

或者,你可以创建一个普通的名单,很多阵列添加到列表中,并最终产生来自使用列表中所需阵列numpy.array(list_of_arrays)或进行更多的控制, numpy.vstack(list_of_arrays)

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

就像@heltonbiker在他的回答中提到的那样,如果满足您的需求,像np.genfromtext这样的东西将是最好的方法。 否则,建议阅读有关追加到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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM