【问题标题】:Convert 2D array to 3D numpy array将 2D 数组转换为 3D numpy 数组
【发布时间】:2019-10-31 05:50:41
【问题描述】:

我创建了一个 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)

【问题讨论】:

  • 请分享一个数组样本和预期输出
  • 所以你有一个熊猫数据框列表数组..??
  • 正如 yatu 所说,数据结构似乎不正常。为了避免XY problem,你能分享更多关于你打算做什么的背景吗? Dataframes 在设计时考虑到了 2d 数据(典型情况是样本数与属性),因此将它们堆叠成 3d numpy 数组没有什么意义;您通常希望将它们作为列表/字典分开保存,或者将它们堆叠为数据框,并添加一行用于索引。
  • 错误出现在哪里?可能不需要data1D = np.array(data) 步骤。 np.stack 与数组列表一起使用(事实上,如果给定一个数组,它只会将其视为一个列表)。 np.stack(data) 应该可以工作,如果 data 真的是匹配大小数组的列表。
  • 我认为,在做我想做的事情之前,我必须使用 pd.get_values() 将 dfs 转换为矩阵,然后尝试基于此创建矩阵。最终目标是为神经网络创建一个矩阵(前馈和 rnn)。

标签: python list numpy multidimensional-array


【解决方案1】:

你需要使用

 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/

【讨论】:

  • 有什么问题
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    从您的问题看来,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),你最终会得到想要的输出形状,但你的数据会是错误的顺序。

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 1970-01-01
      • 2017-07-26
      • 2017-07-27
      • 2015-12-26
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2018-04-20
      相关资源
      最近更新 更多