Pythonic方法根据值选择数组的元素?

时间:2015-08-21 12:29:36

标签: python arrays numpy

我正在寻找一种从数组中提取一系列值的pythonic(1行)方法 这是一些示例代码,它将从x,y数据中提取> 2和< 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])

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 < 3 7 < x < 9以及相应的y值。

2 个答案:

答案 0 :(得分:8)

您可以使用&将元素明确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 :(得分: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)]