Python 如何将嵌套列表(3D)转换为数组

Python 如何将嵌套列表(3D)转换为数组,python,arrays,list,numpy,Python,Arrays,List,Numpy,我在列表中有一个嵌套列表,我想将其转换为numpy数组。有什么办法让它工作吗?如何“遵守”这些维度或什么?这些是特定尺寸(5249、40、94)的形状,下面是一些代码: print(list[0]) print("") print("############################################################################################################") pr

我在列表中有一个嵌套列表,我想将其转换为numpy数组。有什么办法让它工作吗?如何“遵守”这些维度或什么?这些是特定尺寸(5249、40、94)的形状,下面是一些代码:

print(list[0])
print("")
print("############################################################################################################")
print("")
print(list[0][0])
print("")
print("############################################################################################################")
print("")
print(list[0][0][0])
输出:

[[-6.61763245e+02 -6.64446411e+02 -6.69300354e+02 ... -5.77811462e+02
  -6.03125916e+02 -6.44908325e+02]
 [ 5.16810684e+01  4.93927383e+01  4.33423386e+01 ...  1.15522194e+02
   1.02576866e+02  7.31012421e+01]
 [ 2.85251961e+01  2.91995888e+01  2.44578667e+01 ...  2.78144531e+01
   3.44897461e+01  4.35078812e+01]
 ...
 [-4.82816219e-01  2.96157646e+00  4.19265079e+00 ... -5.56250429e+00
  -2.69588089e+00  9.44380760e-02]
 [ 2.64353752e-01  4.48119164e+00  6.22685146e+00 ... -5.64488232e-01
  -9.20243263e-02  2.12504435e+00]
 [ 3.63748550e-01  4.75209856e+00  7.24038124e+00 ...  7.15274096e+00
   7.77531719e+00  5.09825420e+00]]

############################################################################################################

[-661.76324 -664.4464  -669.30035 -679.77814 -690.35443 -660.9415
 -559.9239  -485.485   -438.78836 -415.3624  -390.37952 -373.00934
 -362.99307 -373.43564 -398.9366  -370.4043  -316.54483 -302.01596
 -297.92493 -276.72098 -247.64464 -265.17184 -323.19016 -389.68723
 -405.23648 -405.97824 -401.15686 -393.97366 -389.72104 -393.87613
 -421.2706  -453.30283 -476.209   -510.27377 -484.22525 -449.0411
 -436.07883 -417.73248 -406.98907 -427.94107 -463.365   -505.69937
 -551.2041  -583.83923 -593.5474  -574.877   -544.497   -496.86914
 -455.1289  -441.72507 -426.9304  -424.22696 -431.49948 -427.11542
 -426.9054  -421.04877 -410.71277 -420.71997 -432.1894  -438.21225
 -488.68088 -560.41223 -603.5054  -563.4358  -519.3162  -518.875
 -546.30237 -547.3298  -549.09814 -543.82275 -512.5244  -439.3493
 -380.52084 -343.0858  -314.34274 -307.8192  -345.0038  -380.26834
 -358.30072 -338.74014 -324.08173 -323.67844 -338.8997  -376.0949
 -407.73825 -472.8915  -571.7233  -632.6836  -669.91046 -646.43445
 -607.1672  -577.81146 -603.1259  -644.9083 ]

############################################################################################################

-661.76324
当我尝试将其转换为数组时,出现以下错误:

>>> list_x = np.asarray(list)

ValueError: could not broadcast input array from shape (40,94) into shape (40) 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-44-eaaeafee7c41> in <module>
----> 1 list_x = np.asarray(list)

/opt/conda/lib/python3.7/site-packages/numpy/core/_asarray.py in asarray(a, dtype, order)
     83 
     84     """
---> 85     return array(a, dtype, copy=False, order=order)
     86 
     87 

ValueError: could not broadcast input array from shape (40,94) into shape (40)
列表x=np.asarray(列表) ValueError:无法将输入数组从形状(40,94)广播到形状(40) --------------------------------------------------------------------------- ValueError回溯(最近一次调用上次) 在里面 ---->1列表x=np.asarray(列表) /asarray中的opt/conda/lib/python3.7/site-packages/numpy/core//\u asarray.py(a,数据类型,顺序) 83 84 """ --->85返回数组(a,数据类型,副本=False,顺序=order) 86 87 ValueError:无法将输入数组从形状(40,94)广播到形状(40)
如果所有子列表的长度相同,则您的过程将正常工作。如注释中所述,很可能有一个或多个子列表的长度不一致

请参阅下面的代码以确认其是否按预期工作。前4行从np.array(
start
)创建起始列表(
l1
)。最后3行从列表创建数组,然后打印新的数组形状和内容

a0, a1, a2 = 4, 3, 2
start = np.arange(a0*a1*a2).reshape(a0,a1,a2)
print(start)   
l1 = start.tolist()

end = np.array(l1)
print('\n end shape=',end.shape,'\n')
print(end)
下面是一种在尝试创建数组之前测试列表的方法。下面的代码继续上面的示例。它向两个子列表添加一项,然后循环计数并将计数保存在数组
arr\u cnt
中。最后一步测试
arr\u cnt
中的所有值是否相同(或不相同)。对于本例,它将打印
False

l1[0][0].append(3)
l1[-1][-1].append(5)
print(l1)

arr_cnt=np.empty( (len(l1),len(l1[0])), dtype=int)
for i,l2 in enumerate(l1):
    for j,l3 in enumerate(l2):
        arr_cnt[i,j] = len(l3)
        
# test arr_cnt values; True when all values are identical
print( (arr_cnt[0] == arr_cnt).all() )

子列表的形状不一致。