超过32维的numpy ndarray

12

当我试图创建一个超过32个维度的numpy数组时,会出现错误:

import numpy as np

np.ndarray([1] * 33)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-78103e601d91> in <module>()
----> 1 np.ndarray([1] * 33)

ValueError: sequence too large; cannot be greater than 32

我发现这个问题:Using numpy.array with large number of dimensions 与这个问题有关,但我希望不需要构建自己的版本。

我的用例:
我正在处理联合概率分布,我试图在每个变量上表示一个轴,以便对其进行计算(边缘化、缩减)是单行操作。例如,对于边缘化操作,我可以简单地对该变量的轴进行求和。对于乘法,我可以简单地进行numpy乘法(在检查轴是否相同时)。

是否有可能绕过这个问题?


解决方法取决于具体的使用情况。能否提供更多背景信息? - Eelco Hoogendoorn
9
您知道一个32维的数组,即使它只有最小的形状为[2]*32和float32类型,也会占用16GB内存吗? - Eelco Hoogendoorn
4个回答

4

简单的解决方法

如果你创建一个 np.array(np.array(li))
其中 li 是一个 list,并且 len(li) > 32,它将返回预期的 ndarray。


1
如何将数据维护在1d中,并有选择地重新塑造以关注给定的维度。
举个例子:
In [252]: x=np.arange(2*3*4*5)

使用完整的重塑

In [254]: x.reshape(2,3,4,5).sum(2)
Out[254]: 
array([[[ 30,  34,  38,  42,  46],
        [110, 114, 118, 122, 126],
        [190, 194, 198, 202, 206]],

       [[270, 274, 278, 282, 286],
        [350, 354, 358, 362, 366],
        [430, 434, 438, 442, 446]]])

使用部分重塑-相同的数字,不同的结果形状

In [255]: x.reshape(6,4,5).sum(1)
Out[255]: 
array([[ 30,  34,  38,  42,  46],
       [110, 114, 118, 122, 126],
       [190, 194, 198, 202, 206],
       [270, 274, 278, 282, 286],
       [350, 354, 358, 362, 366],
       [430, 434, 438, 442, 446]])

我不会在接近32个维度的任何情况下进行测试。正如评论中所指出的,如果许多维度大于1,则整个数组的大小将过大。


0

使用np.array而不是np.ndarray


0
截至2020年11月17日,numpy数组的维数限制仍为32。要找到这个限制,我运行了以下代码:
for dim in range (1, 100):
    arr_n_dim_list = [1]*dim
    arr_n_dim = np.ones((arr_n_dim_list))
    print(arr_n_dim.shape)

输出的最后一行是:

ValueError: maximum supported dimension for an ndarray is 32, found 33

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