【问题标题】:How to create empty numpy array of arrays如何创建空的numpy数组数组
【发布时间】:2021-06-11 14:09:03
【问题描述】:

我想要一个 numpy 数组,每个数组元素将是另一个整数数组(或 python 列表)。

import numpy as np
arr = np.empty(2, dtype=int) # what to put here? int? list?

arr = np.append(arr, [0,1]) # there will be always exactly two numbers added
arr = np.append(arr, [1,1])
arr = np.append(arr, [5,1])
# and so on - I want to append undefined amount of times, these numbers are computed at runtime

我得到了什么:

0: 0
1: 1
2: 1
3: 1
4: 5
5: 1

我想得到什么:

0: [0,1]
1: [1,1]
2: [5,1]

这里的重点是我想在之后迭代:

for element in arr:
    x = element[0]
    y = element[1]
    # do something with x and y here

因为这已经实现了,我不想重构很长的代码。 您能否告诉我任何解决方案,如何正确初始化这个数组,以及哪些(元组、列表、numpy 数组)应该在那里存储整数,以使其尽可能快?

谢谢

【问题讨论】:

  • 你看到文档中关于axis 的注释了吗?重复append 很慢。不要这样做,特别是如果您不了解尺寸或文档。
  • 列表列表将是最快的,无论是创建还是迭代访问。
  • @hpaulj 我会试一试,非常感谢您的宝贵时间!

标签: python arrays list performance numpy


【解决方案1】:

由于第二个暗淡,您需要将这两个数字附加到另一个列表中。

arr = np.empty((0,2),int)
arr = np.append(arr, [[0, 1]], axis=0)
arr = np.append(arr, [[1, 1]], axis=0)
arr = np.append(arr, [[5, 1]], axis=0)

arr 现在应该是:

array([[0, 1],
       [1, 1],
       [5, 1]])

【讨论】:

    【解决方案2】:

    你可以使用deque,然后将其转换为numpy数组

    from collections import deque
    import numpy as np
    lists = deque()
    lists.append([0,1])
    lists.append([1,1])
    lists.append([5,1])
    results = np.array(lists)
    results
    

    输出

    array([[0, 1],
           [1, 1],
           [5, 1]])
    

    【讨论】:

    【解决方案3】:

    重复数组追加有几个问题:

    arr = np.append(arr, [[0, 1]], axis=0)
    

    设置初始arr 值需要对数组形状有所了解。它不像np.array([])那么简单。并且每个append(实际上是np.concatenate)都会创建一个全新的数组,并进行完整的数据复制。另一方面,列表追加只是添加对现有列表的引用。

    所以如果需要迭代制作数组,一般推荐list append:

    In [10]: alist = []
        ...: for row in [[0,1],[1,1],[5,1]]:
        ...:     alist.append(row)
        ...: arr = np.array(alist)
        ...: 
    
    In [11]: alist
    Out[11]: [[0, 1], [1, 1], [5, 1]]
    In [12]: arr
    Out[12]: 
    array([[0, 1],
           [1, 1],
           [5, 1]])
    

    另一种方法是从arr=np.zeros((3,2),int) 开始并分配连续的arr[i] 行。速度差不多。

    但如果你要逐行迭代,你不妨坚持使用列表——它会更快:

    In [13]: for row in alist:
        ...:     x,y = row
        ...:     print(x,y,x+y)
        ...: 
    0 1 1
    1 1 2
    5 1 6
    

    如果你去创建一个数组,就这样使用它:

    In [14]: arr.sum(axi  s=1)
    Out[14]: array([1, 2, 6])
    

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 1970-01-01
      • 2014-09-20
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      相关资源
      最近更新 更多