如何高效地定义变长的numpy数组?

5
我希望您能够用numpy模块定义可变大小数组的高效方法,但是性能只能通过固定大小的数组来实现。
我的解决方案是定义列表(或元组)如下:
test = [0] * 10

然后使用numpy数组定义"test"的每个元素,如下:

test[0] = numpy.array([1,2,3])
test[1] = numpy.array([4,5])
...

我猜当使用这样的可变大小数组时,可能会导致散乱的内存寻址,尽管对于“test”的每个元素仍然保持向量计算。因此,如果有一种有效的方法来定义带有numpy模块的这样的数组,我将不胜感激。

可能是如何在NumPy中堆叠不同长度的向量?的重复问题。 - Daniel F
1
简短回答:不行。长话短说:你可以尝试,但你会得到一个 dtype = object 的数组,除了列表的作用之外,它几乎没有什么用处。 - Daniel F
感谢丹尼尔的评论。我正在考虑使用一维内存寻址来解决这个问题,这可能会防止不当的内存访问,但需要额外的数组来指定该数组中每个元素的起始索引。 - behzad baghapour
1个回答

4
您可以在后台创建一个大的分配,并创建许多较小的视图:
backing = np.empty(10, np.int32)
my_data = [
    backing[0:2],
    backing[2:5],
    backing[5:10]
]

my_data[0][...] = [1, 3]
my_data[1][...] = [1, 3, 5]
my_data[2][...] = [1, 3, 5, 7, 9]
print(my_data)
# [array([1, 3]), array([1, 3, 5]), array([1, 3, 5, 7, 9])]

这样做的好处是,如果需要,你仍然可以操作平面数组:

backing += 1  # add to all sublists
print(my_data)
# [array([2, 4]), array([2, 4, 6]), array([ 2,  4,  6,  8, 10])]

谢谢Eric。一开始分配总内存量是个好主意。我在这里的问题是,“my_data”是否作为“backing”numpy数组的指针(或者它会增加额外的内存分配)? - behzad baghapour
my_data 只包含对原始数组的“指针”列表 - 但是指针也需要分配,它们只是固定大小的 ;) - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接