【问题标题】:Python numpy array of numpy arraysPython numpy 数组的 numpy 数组
【发布时间】:2015-07-06 15:46:30
【问题描述】:

我在创建 numpy 数组的 numpy 数组时遇到了问题。 我会循环创建它:

a=np.array([])
while(...):
   ...
   b= //a numpy array generated
   a=np.append(a,b)
   ...

想要的结果:

[[1,5,3], [9,10,1], ..., [4,8,6]]

实际结果:

[1,5,3,9,10,1,... 4,8,6]

有可能吗?我不知道数组的最终维度,所以我无法用固定维度对其进行初始化。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    永远不要在循环中追加numpy 数组:与基本 Python 相比,这是 NumPy 非常不擅长的一项操作。这是因为您正在为每个 append 制作数据的完整副本,这将花费您二次时间。

    相反,只需将数组附加到 Python 列表并在最后进行转换即可;结果更简单更快:

    a = []
    
    while ...:
        b = ... # NumPy array
        a.append(b)
    a = np.asarray(a)
    

    至于为什么您的代码不起作用:np.append 的行为根本不像 list.append。特别是,它不会在追加时创建新维度。您必须创建具有二维的初始数组,然后附加显式轴参数。

    【讨论】:

    • 感谢您的回复。最大的问题是我需要大约 100 个数组,每个数组都有一个非常大的维度,每个数组里面都有 1440000 个整数。使用列表我的程序被操作系统杀死。有什么建议吗?
    • 你能猜出你将拥有多少个元素,并预先分配一个足够大的数组吗?如果不是,您可能必须变得非常聪明,例如以块或其他方式构建输出数组。
    • 您还应该能够使用更大的数组进行预分配,然后在知道实际存在多少元素后在最后使用该数组的视图。
    • 终于听从了你的建议!谢谢!
    【解决方案2】:

    我们也可以试试:

    arr1 = np.arange(4)
    arr2 = np.arange(5,7)
    arr3 = np.arange(7,12)
    
    array_of_arrays = np.array([arr1, arr2, arr3])
    array_of_arrays
    np.concatenate(array_of_arrays)
    

    【讨论】:

    • 是的,关键是每个内部数组都应该是 numpy 而不是列表,因为这样可以节省所有空间。然后从数组列表中创建一个数组。
    • 不推荐从不规则的嵌套序列(这是一个列表或元组的列表或元组或具有不同长度或形状的 ndarray 的列表或元组)创建一个 ndarray。如果您打算这样做,则必须在创建 ndarray 时指定“dtype=object”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2019-01-31
    • 2011-09-23
    • 2017-12-23
    • 2021-11-24
    • 2018-09-18
    相关资源
    最近更新 更多