具有超过 32 个维度的 numpy ndarray
numpy ndarray with more that 32 dimensions
当我尝试创建一个超过 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 乘法(在检查轴是否相同之后)。
是否有可能的解决方法?
如何在 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,则整个数组大小将过大。
截至 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.array(li))
其中 li
是 list
和 len(li) > 32
,它会 return 一个预期的 ndarray。
当我尝试创建一个超过 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 乘法(在检查轴是否相同之后)。
是否有可能的解决方法?
如何在 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,则整个数组大小将过大。
截至 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.array(li))
其中 li
是 list
和 len(li) > 32
,它会 return 一个预期的 ndarray。