2012-08-08 55 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,:] 

哪些不會創建重複(儘管這裏仍然需要重新塑造)?