Ничего плохого в коде, потому что в первом случае у вас нет трехмерного массива. По определению массива N-d (здесь 3d) первые две строки объясняют, что каждое измерение должно иметь одинаковый размер . В первом случае:
df = pd.DataFrame(np.random.rand(4,5), columns = list('abcde'))
df['a'][3:]=1
df['a'][:3]=2
a3d = np.array(list(df.groupby('a').apply(pd.DataFrame.as_matrix)))
У вас есть 1-й массив размером 2 (это то, что показывает a3d.shape
), который содержит 2-й массив форм (1,5) и (3,5)
a3d[0].shape
Out[173]: (1, 5)
a3d[1].shape
Out[174]: (3, 5)
поэтому оба элемента в первом измерении того, что вы называете a3d
, не имеют одинакового размера и не могут рассматриваться как другие измерения этого ndarray
.
Во втором случае
df = pd.DataFrame(np.random.rand(4,5), columns = list('abcde'))
df['a'][2:]=1
df['a'][:2]=2
a3d = np.array(list(df.groupby('a').apply(pd.DataFrame.as_matrix)))
a3d[0].shape
Out[176]: (2, 5)
a3d[1].shape
Out[177]: (2, 5)
оба элемента вашего первого измерения имеют одинаковый размер, поэтому a3d
- это трехмерный массив.