2015-08-21 70 views
1

我正在尋找pythonic(單線)方法從數組中提取一系列值 下面是一些示例代碼,它將從x,y數據中提取數據元素> 2和< 8,並將put他們成爲一個新的陣列。有沒有辦法在一條線上完成這一點?下面的代碼工作,但似乎比它需要的更糟糕。 (注意:實際上,我在我的應用程序彩車工作)基於數值選擇數組元素的Pythonic方法?

import numpy as np 

x0 = np.array([0,3,9,8,3,4,5]) 
y0 = np.array([2,3,5,7,8,1,0]) 

x1 = x0[x0>2] 
y1 = y0[x0>2] 
x2 = x1[x1<8] 
y2 = y1[x1<8] 

print x2, y2 

這將打印

[3 3 4 5] [3 8 1 0] 

(b)部分的問題將是提取值說1 < x < 37 < x < 9以及其相應的值爲y

回答

7

你可以連續使用&爲逐元素logical and|爲逐元素logical or,使得條件2 < x0x0 < 8變得

mask = (2 < x0) & (x0 < 8) 

例如布爾數組,

import numpy as np 

x0 = np.array([0,3,9,8,3,4,5]) 
y0 = np.array([2,3,5,7,8,1,0]) 

mask = (2 < x0) & (x0 < 8) 
x2 = x0[mask] 
y2 = y0[mask]  
print(x2, y2) 
# (array([3, 3, 4, 5]), array([3, 8, 1, 0])) 

mask2 = ((1 < x0) & (x0 < 3)) | ((7 < x0) & (x0 < 9))  
x3 = x0[mask2] 
y3 = y0[mask2] 
print(x3, y3) 
# (array([8]), array([7])) 
1
import numpy as np 

x0 = np.array([0,3,9,8,3,4,5]) 
y0 = np.array([2,3,5,7,8,1,0]) 
list(zip(*[(x,y) for x, y in zip(x0, y0) if 1<=x<=3 or 7<=x<=9])) 

# [(3, 9, 8, 3), (3, 5, 7, 8)]