2014-08-28 84 views
1

我有两个相同大小的数组对象(DATA和DEGREE)的一维数组。两个阵列是其他8个阵列的集合:为定义的时间间隔拾取numpy数组的元素

DATA = array([array([ 22.]), 
    array([ 26., 16., 23., 0., 20., 23., 0., 19.]), 
    array([ 0., 0., 0., 0., 20., 0., 0., 18., 18., 0., 0., 
    0., 23., 20., 20., 15.]), 
    array([ 20., 0., 0., 18., 0., 13., 0., 0., 0., 0., 0., 
    0., 25., 18., 0., 0., 0., 0., 0., 0.]), 
    array([ 0., 0., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 
    0., 0., 0., 0., 1., 0.]), 
    array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
    0., 0.]), 
    array([ 0., 0., 0., 0., 0., 0., 0., 0., 0.]), 
    array([ 1., 0.])], dtype=object) 



DEGREE = array([array([0]), 
    array([ 0, 45, 90, 135, 180, -90, -135, -45]), 
    array([-153, -90, -116, -135, 26, 116, 90, -63, 63, 180, 153, 
    135, 0, -26, 45, -45]), 
    array([ -18, 123, 56, 0, 161, 18, 180, 90, -56, -161, 71, 
    146, -33, 33, -123, -146, 108, -108, -71, -90]), 
    array([ 14, -104, -116, -90, 75, 135, -75, -63, 45, 63, -14, 
    26, -135, -45, 0, 90, -26, 116, 104]), 
    array([ 30, 53, 45, 126, 36, -126, 21, -53, 11, -45, 0, 
    -36, -11, -30, -21]), 
    array([-38, -26, 26, -18, -9, 38, 0, 9, 18]), 
    array([-33, 33])], dtype=object) 

我想拾取数据阵列的对应于那些度阵列的限定一定的“阿尔法”角度区间的元素。例如,对于-90 < = alpha < -70我应该得到下面报告的输出数组。在特定角度间隔内没有找到角度时,算法应该返回零,例如在输出的第一个数组的情况下。

Output = array([array([0]), 
     array([23]), 
     array([0]), 
     array([0]), 
     array([1,0]), 
     array([0]), 
     array([0]), 
     array([0])], dtype=object) 

的想法是将有-90和+90之间的α改变为20度步骤,即-90 < =阿尔法< -70,-70 < =阿尔法< -50,-50 < = alpha < -30等最后有9个输出数组。我怎么能这样做?预先感谢您

+0

只是提醒的数据和学位是数组对象的1-d阵列... – 2014-08-28 13:29:55

+0

谢谢,我刚刚编辑它 – diegus 2014-08-28 13:35:42

回答

0

我认为您最好的选择是使用列表解析和掩码。下面应该做的伎俩:

import numpy as np 

def val_check(val_in): 
    ''' Check for non-zero values in numpy array ''' 
    if val_in.any(): 
     return val_in 
    else: 
     return np.array([0]) 

# Set tuples of desired ranges 
angles = [] 
angle = -90 
while angle < 90: 
    angles.append((angle, angle + 20)) 
    angle = angle + 20 

out = [] 
for ang in angles: 
    # List comprehensions to get masks for elements in desired range per array 
    mask = [(arr >= ang[0]) * (arr < ang[1]) for arr in DEGREE] 
    mask_index = [np.where(m) for m in mask] 
    # Include data corresponding to masks 
    out_temp = [dat[mi[0]] for (dat, mi) in zip(DATA, mask_index)] 
    # Replace empty elements with np.array([0]) 
    out_temp = np.array([val_check(ot) for ot in out_temp]) 
    out.append(out_temp) 

如果你想输出作为数组,而不是一个列表,包括一个最后一行out = np.array(out)

+0

非常感谢。它似乎工作得很好。 – diegus 2014-08-29 08:15:24

+0

好!我很高兴能够提供帮助。 – philE 2014-08-29 14:34:36

+0

p.s.这个问题实际上与我的下一个问题有关:“用矩阵排列一维数组对象”也许你也知道如何解决这个问题。 – diegus 2014-08-29 14:38:54