我正在开发一个项目,其中有一组手势识别示例(ChaLearn 数据集)。
输入是一个 (10000,6,32,64,64) 数组。我有 10000 个示例,6 个特征图( body 、左手、右手深度和 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 部分:)
最佳答案
正如另一个答案中提到的,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)
实际上,由于您的 深度_idx
恰好可以作为切片写入,因此对于这种特殊情况,您实际上最好这样做:
samples = samples[:, 1::2, frame_idx].reshape(-1, 12, 64, 64)
关于python - 减少n维numpy数组维数的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29608339/