python - 减少n维numpy数组维数的有效方法

标签 python arrays numpy merge concatenation

我正在开发一个项目,其中有一组手势识别示例(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/

相关文章:

python - 为什么 ImageStat 返回有符号整数图像 (`mode=' I'`) 的错误统计信息?

python - NumPy 中的模型测量和误差

python - Django Framework - 是否有可以订阅的关闭事件?

python - python 中的高效字符串比较,包括数值评估

python - fsolve 和 numpy 的使用

python - NumPy 能否注意数组(非严格地)沿一个轴递增?

javascript - 将对象数组分类为新数组

python - Pandas 的表现就像两个有条件的数据帧的计数一样

python - 在 python 多处理池中共享 numpy 数组

java - 将两个 ArrayList 转换为 String[][]