2012-08-08 56 views
1

是否有可能像花式索引一样使用接管多个轴?在多维数组上使用numpy.take?

多维数组相当大,所以我希望能够加快速度。

例如:

import numpy as np 
x = np.random.rand(20,20,20,20) 
m = np.where(x>0.5) 
m = (m[0],m[1],m[2]) 
print x[m].shape 
+0

你可以扩展吗?你是否希望从你的代码示例中获得相同的结果,但是更快地使用'numpy.take'? 'x [x> 0.5]'不会给你想要的结果吗? – YXD 2012-08-08 16:30:24

+0

是的,我希望能够取得更好的表现。 x [x> 0.5]与我只拍m的前三个轴不一样。 – 2012-08-08 18:18:33

回答

3

您的代码:

m = np.where(x>0.5) 
m = (m[0],m[1],m[2]) 
result = x[m] 

可以写成通过重复来避免np.where:

m = np.sum(x>0.5,-1) 
result = x.reshape(-1,x.shape[-1]).repeat(w.ravel(), 0) 

这似乎快约4倍。然而,我不知道你是不是故意要求

m = np.any(x>0.5,-1) 
result = x[m,:] 

哪些不会创建重复(尽管这里仍然需要重新塑造)?