【问题标题】:Appending arrays in numpy在 numpy 中追加数组
【发布时间】:2014-11-03 07:32:19
【问题描述】:

我有一个循环读取文件直到到达结尾。在每次通过循环时,我都会提取一个 1D numpy 数组。我想将此数组附加到二维方向上的另一个 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)' 调整大小并得到我想要的。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

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

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

    或者,您可以创建一个常规列表,将大量数组附加到该列表中,最后使用numpy.array(list_of_arrays)numpy.vstack(list_of_arrays) 从列表中生成所需的数组。

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

    【讨论】:

    • 我必须循环到文件末尾,因为该文件的结构有些复杂,以至于 numpy 没有能够读取它的通用方法。我已经有了自己的文件读取方法,而且非常好,我只想实现我在问题中提出的要求,这样它就“更好”了。
    • 那么我建议在我的回答中使用第二种方法。
    【解决方案2】:

    正如@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)
    

    【讨论】:

      猜你喜欢
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 2016-04-08
      • 2015-02-21
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多