当我尝试创建一个超过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
我发现这个:使用numpy。与此问题相关的大量维度数组,但我想这样做而不构建自己的版本。
我的用例:
我正在研究联合概率分布,我试图在一个轴上表示每个变量,这样对它的计算(边缘化,减少)是一个单线操作。例如,对于边际运算,我可以简单地对变量的轴求和。对于乘法,我可以简单地做一个简单的numpy乘法(在检查轴是否相同之后)。
是否有可能解决这个问题?
简单方法
如果创建了np.array(np.array(li))
当li
是list
和len(li) > 32
时,它将按预期返回一个数组
如何在一维中维护数据,并有选择地重塑以聚焦于给定维度
来说明
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,那么整个数组的大小将会过大。
截至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
使用np.array
而不是np.ndarray