替换并平坦 Numpy 数组

Replace and flat Numpy array

我有形状为 (2,1) 的 ndarray。 每个元素都是一个形状为 (4) 的 ndarray 我想制作一个形状为 (2,4)

的数据框

当前形状:

df.shape = (2,1)
df[0].shape = (1,)
df[0][0].shape = (4,)

例如:

df[0][0] = [1 2 2 4]
df[1][0] = [1 1 1 1]

我希望它看起来像这样:

df[0] = [1 2 2 4]
df[1] = [1 1 1 1]

你想要这样的东西吗:

df = pd.DataFrame(a.reshape((2, 4)).T)

df
   0  1
0  1  1
1  2  1
2  2  1
3  4  1

或者:

df = pd.DataFrame(a.reshape((2, 4)))

df
   0  1  2  3
0  1  2  2  4
1  1  1  1  1

您可以使用另一个数据框重新排列然后将其设置回去,例如:

df2 = pd.DataFrame([df[0][0], df[0][1]])
df = df2

更新:关于@Koren Levenbrown

的评论
df = np.array([df[column][0] for column in df])

是另一种解决方案

看起来你有一个对象 dtype 数组(但为什么叫它 df?):

In [150]: df = np.empty((2,1),object)                                                                           
In [151]: df[0,0] = np.array([1,2,2,4])                                                                         
In [152]: df[1,0] = np.array([1,1,1,1])                                                                         
In [153]: df                                                                                                    
Out[153]: 
array([[array([1, 2, 2, 4])],
       [array([1, 1, 1, 1])]], dtype=object)
In [154]: df.shape                                                                                              
Out[154]: (2, 1)
In [155]: df[0].shape                                                                                           
Out[155]: (1,)
In [156]: df[0,0].shape                                                                                         
Out[156]: (4,)

np.concatenate(或 stack 派生之一)可以连接 list/iterable 个数组,前提是它们的大小匹配。

stack 直接应用于 df 不起作用,因为它是 (2,1) 形状的:

In [157]: np.stack(df)                                                                                          
Out[157]: 
array([[array([1, 2, 2, 4])],
       [array([1, 1, 1, 1])]], dtype=object)

但是如果我们首先拆解(或挤压)数组,那么它是 (2,) 形状:

In [158]: np.stack(df.ravel())                                                                                  
Out[158]: 
array([[1, 2, 2, 4],
       [1, 1, 1, 1]])