【问题标题】:Effective way to reduce dimension of an n-dimensional numpy array减少n维numpy数组维数的有效方法
【发布时间】:2015-06-18 22:35:37
【问题描述】:

我正在开展一个项目,其中有一组手势识别示例(ChaLearn 数据集)。

输入是一个 (10000,6,32,64,64) 数组。我有 10000 个示例,6 个特征图(身体、左手、右手深度和 rgb 图像),32 帧 64 x 64。

我必须只选择深度图像(索引 1、3 和 5)和 32 帧中的 4 帧(索引 8、13、18、25)

我对 python 不是很熟悉,所以我在搞乱,我认为我的解决方案很好,但它真的很慢。大多数情况下,这两个选择会占用大量时间(这一点需要 70-80 秒)。

samples.shape 一开始就给了我 (10000,6,32,64,64)

samples = samples[0:samples.shape[0],0:samples.shape[1],(7,13,18,25)]
samples = samples[0:samples.shape[0],(1,3,5)]
samples = floatX(samples.reshape((samples.shape[0],12,64,64)))/255.

samples.shape 最后给了我 (10000,12,64,64)。

有没有更有效的方法来实现我的目标?还是我完全错了?

暂时忽略 floatx 部分 :)

【问题讨论】:

    标签: python arrays numpy merge concatenation


    【解决方案1】:

    有没有更有效的方法来实现我的目标?

    如果您愿意研究另一层抽象,您可能需要考虑一种专为更大数据设计的格式。就个人而言,我使用HDF,它有一些不错的python 模块,如h5pypytables

    我看到了两个主要优点,您将能够一次存储更大的数据集(因为您不必将整个数据集加载到内存中)并且您将能够将元数据应用于数据(.attrs)。当您构建 hdf 数据集时,您可以对其进行组织,以便您对“索引 1、3 和 5”之类的“查询”更加合乎逻辑。

    【讨论】:

    • 我已经从 h5py 模块中获取了数据。它以 HDF 格式提供给我。我正在考虑只是在我需要的结构中重写数据并将旧结构作为备份。谢谢输入!
    【解决方案2】:

    正如另一个答案中提到的,在 numpy 中有一些关于使这更容易的讨论,但在你的情况下,由于你想要索引的两个轴在形状上是相邻的,事情还不错。在完全避免中间副本之后,这应该会让你得到你现在的样子:

    depth_idx = np.array([1, 3, 5], dtype=np.intp)
    frame_idx = np.array([8, 13, 18, 25], dtype=np.intp)
    samples = samples[:, depth_idx[:, None], frame_idx].reshape(-1, 12, 64, 64)
    

    实际上,由于您的 depth_idx 恰好可以作为切片写入,因此对于这种特殊情况,您实际上会更好:

    samples = samples[:, 1::2, frame_idx].reshape(-1, 12, 64, 64)
    

    【讨论】:

      【解决方案3】:

      首先,您可以使用samples[:,:,(7,13,18,25)]。但是,这很慢的原因是因为您正在执行 2 次复制操作。你目前无法解决这个问题,尽管你可以使用take 来简化一些事情:

      samples = np.take(np.take(samples, [7,13,18,25], axis=2), [1,3,4], axis=1)
      

      实际上正在进行一些工作以使您尝试执行的操作更容易,但还没有准备好。

      如果你没有使用numpy 1.9,你绝对应该升级到它,因为你正在做的“花式”索引要快得多。 take 版本在早期版本中会更快。

      【讨论】:

      • 好的。是的,我之前曾尝试在一项操作中进行花哨的选择,但它给了我一个错误,即目前只允许进行一项选择。太糟糕了。感谢您的快速回复和帮助!
      猜你喜欢
      • 1970-01-01
      • 2011-03-25
      • 2011-06-14
      • 1970-01-01
      • 2020-05-06
      • 2013-04-15
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      相关资源
      最近更新 更多