2014-08-28 80 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