将矩阵数组制作矩阵/ Python Pandas三元组数组

时间:2017-08-16 17:19:42

标签: python arrays pandas matrix

我在阵列中有891个大小为7X32的矩阵。我想得到891三倍大小为7X32的矩阵。

两个矩阵的示例(显然不是那个大小):

[[1,1,1,1,1],
[2,2,2,2,2],
[3,3,3,3,3]],
[[2,2,2,2,2],
[2,2,2,2,2],
[3,3,3,3,3]]

我需要它成为:

[[1,1,1,1,1],
[2,2,2,2,2],
[3,3,3,3,3]],
[[1,1,1,1,1],
[2,2,2,2,2],
[3,3,3,3,3]],
[[1,1,1,1,1],
[2,2,2,2,2],
[3,3,3,3,3]],
[[2,2,2,2,2],
[2,2,2,2,2],
[3,3,3,3,3]],
[[2,2,2,2,2],
[2,2,2,2,2],
[3,3,3,3,3]],
[[2,2,2,2,2],
[2,2,2,2,2],
[3,3,3,3,3]],

其中[]表示它是一个不同的矩阵。

我用来获取矩阵的代码:

matrices = np.dstack([df.values.astype(int)] * 32)

来自常规数据框。

我想也许

matrices = np.dstack([[df.values.astype(int)] * 32]*3)

会起作用,但事实并非如此。

我这样做是为了尝试将常规问题变成像cifar 10数据一样的“图像”。

2 个答案:

答案 0 :(得分:3)

再延长一个暗淡/轴后使用np.repeat -

np.repeat(a[None],3,axis=0)

示例运行 -

In [140]: a
Out[140]: 
array([[7, 1, 8, 6],
       [5, 8, 1, 1],
       [2, 7, 3, 7]])

In [141]: np.repeat(a[None],3,axis=0)
Out[141]: 
array([[[7, 1, 8, 6],
        [5, 8, 1, 1],
        [2, 7, 3, 7]],

       [[7, 1, 8, 6],
        [5, 8, 1, 1],
        [2, 7, 3, 7]],

       [[7, 1, 8, 6],
        [5, 8, 1, 1],
        [2, 7, 3, 7]]])

我们也可以使用np.broadcast_to -

np.broadcast_to(a[None],(3,) + a.shape) # creates a read-only version

要制作可写版本,请附加.copy()

使用OP和@piRSquared之间的历史以及答案帖子,这是我的飞镖 -

a = df.values.astype(int)
shp = a.shape
out = np.broadcast_to(a[:,None,:,None], (shp[0], 3, shp[1], 32))

答案 1 :(得分:2)

从原始数据框架看,这似乎有效。但是,如果他能够提供你需要的东西,我会推迟@Divakar的建议。

至于我的解决方案,我确信有更好的方法,但这很有效。这甚至可以给@Divakar他需要看的东西,以便向我们展示更好的方式。

np.stack([np.dstack([df.values.astype(int)] * 32)] * 3).transpose(1, 0, 2, 3)

设置

df = pd.DataFrame({
    'Embarked': [0, 1, 1, 3, 1],
    'Family': [1, 1, 0, 1, 0],
    'Fare': [1.0, 2.0, 1.0, 2.0, 2.0],
    'Pclass': [3, 1, 3, 1, 3],
    'Sex': [0, 1, 1, 1, 0],
    'Title': [0, 3, 2, 3, 1]}
)['Pclass Sex Fare Embarked Title Family'.split()]