Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 降低n维numpy阵列维数的有效方法_Python_Arrays_Numpy_Merge_Concatenation - Fatal编程技术网

Python 降低n维numpy阵列维数的有效方法

Python 降低n维numpy阵列维数的有效方法,python,arrays,numpy,merge,concatenation,Python,Arrays,Numpy,Merge,Concatenation,我正在做一个项目,我有一组手势识别的样本(ChaLearn数据集) 输入是一个(10000,6,32,64,64)数组。我有10000个例子,6个特征图(身体,左手,右手深度和rgb图像),32帧64乘64 我必须只选择深度图像(索引1、3和5)和32帧中的4帧(索引8、13、18、25) 我对python不太熟悉,所以我一直在胡闹,我认为我的解决方案很好,但速度非常慢。大多数情况下,这两个选择占用大量时间(此位为70-80秒) samples.shape在开始时为我提供(10000,6,32,

我正在做一个项目,我有一组手势识别的样本(ChaLearn数据集)

输入是一个(10000,6,32,64,64)数组。我有10000个例子,6个特征图(身体,左手,右手深度和rgb图像),32帧64乘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部分:)

首先,您可以执行
示例[:,:,(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
版本会更快。

如另一个答案中所述,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\u idx
恰好可以作为一个片写入,因此在这种特殊情况下,您最好执行以下操作:

samples = samples[:, 1::2, frame_idx].reshape(-1, 12, 64, 64)
有没有更有效的方法来实现我的目标

如果您愿意查看另一层抽象,您可能需要考虑为更大数据设计的格式。就我个人而言,我使用了它,它有一些很好的python模块,比如和


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

Ok。是的,我以前尝试过在一次操作中进行奇特的选择,但它给了我一个错误,即目前只允许进行一次选择。太糟糕了。感谢您的快速回复和帮助!我已经从h5py模块中获取了数据。它是以HDF格式给我的。我正在考虑在我需要的结构中重新写入数据,并保留旧结构作为备份。输入Thx!