将2D数组转换为3D numpy数组

时间:2019-06-17 15:39:03

标签: python list numpy multidimensional-array

我创建了一个numpy数组,该数组的每个元素都包含一个形状相同的数组(9,5)。我想要的是3D阵列。

我尝试使用np.stack。

data = list(map(lambda x: getKmers(x, 9), data)) # getKmers creates a       
                                                 # list of list from a pandas dataframe
data1D = np.array(data)                          # shape (350,)
data2D = np.stack(data1D)

data1D:
array([list([      pdbID  AtomNo Type      Eta    Theta
0  1a9l.pdb     2.0    G  169.225  212.838
1  1a9l.pdb     3.0    G  168.439  206.785
2  1a9l.pdb     4.0    U  170.892  205.845
3  1a9l.pdb     5.0    G  164.726  225.982
4  1a9l.pdb     6.0    A  308.788  144.370
5  1a9l.pdb     7.0    C  185.211  209.363
6  1a9l.pdb     8.0    U  167.612  216.614
7  1a9l.pdb     9.0    C  168.741  219.239
8  1a9l.pdb    10.0    C  163.639  207.044,       pdbID  AtomNo Type          Eta    Theta
1  1a9l.pdb     3.0    G  168.439  206.785
2  1a9l.pdb     4.0    U  170.892  205.845
3  1a9l.pdb     5.0    G  164.726  225.982
4  1a9l.pdb     6.0    A  308.788  144.370
5  1a9l.pdb     7.0    C  185.211  209.363
6  1a9l.pdb     8.0    U  167.612  216.614
7  1a9l.pdb     9.0    C  168.741  219.239
8  1a9l.pdb    10.0    C  163.639  207.044

我收到此错误: 无法将尺寸为9的序列复制到尺寸为5的数组轴上

我想创建一个3D矩阵,其中每个子数组都在新的3D维度中。我猜想新形状是(9,5,350)

3 个答案:

答案 0 :(得分:0)

  

您需要使用

 data.reshape((data.shape[0], data.shape[1], 1))
  

示例

from numpy import array
data = [[11, 22],
    [33, 44],
    [55, 66]]
data = array(data)
print(data.shape)
data = data.reshape((data.shape[0], data.shape[1], 1))
print(data.shape)
  

运行示例首先打印2D数组中每个尺寸的大小,重新排列数组的形状,然后总结新3D数组的形状。

     

结果

(3,2)
(3,2,1)
  

来源:https://machinelearningmastery.com/index-slice-reshape-numpy-arrays-machine-learning-python/

答案 1 :(得分:0)

如果要创建每个子数组都在新3D维度中的3D矩阵,最终形状不是(350,9,5)吗?在这种情况下,您可以简单地使用:

new_array = np.asarray(data).reshape(350,9,5)

答案 2 :(得分:0)

从您的问题看来,getKmers(x,9)产生了一个9个长度为350的列表,而data输入中包含5个元素。您需要一个(9,5,350)数组。这应该可以通过以下方式实现:

arr = np.swapaxes([getKermers(x, 9) for x in data], 0, 1)

请注意,swapaxes与重塑不同。如果仅执行np.array([getKermers(x, 9) for x in data]).reshape(9, 5, 350),最终将得到所需的输出形状,但数据顺序错误。