2012-09-26 166 views
0

我有以下代碼:掩蔽選擇後一個numpy的陣列與非numpy的陣列

# unicorns is a numpy array with several fields 
idx = (1, 2, 3, 5, 7) 
unicorns=uni[idx] 
# now i have only the first, second, third, ... unicorn 
print unicorns 

但是如果我想的子查詢這個麒麟陣列

unicorns['color'=='white']['Name'] 

應該給我的名字的白色獨角獸,numpy只將 的color==white部分解釋爲False,它會變爲0,它會返回我的數組的第一個條目。

我該如何解決這個問題,以便它能做到我想要的,選擇白色的獨角獸?

我寧願一切都保持爲numpy,所以我也可以選擇獨角獸的其他屬性。

編輯

下面是數組的例子:

unicorns=[(1, black, 0.0, 'Pinky', 1) (2, black, 0.0, 'Winky', 1) 
(3, white, 0.0, 'Lala', 1) (4, white, 0.0, 'Merlin', 1) 
(5, black, 0.0, 'Meriva', 1) (6, white, 0.0, 'Panda', 1)] 
    idx = [ 0 , 3 , 6 ] 
+0

你可以發佈一個最小版本的'獨角獸',可以用來重現問題嗎? –

回答

1

你probabply要使用什麼是numpy.where功能。 使用方法如下:

>>>unicorns=np.array([[1, "black", 0.0, 'Pinky', 1] , 
         [2, "black", 0.0, 'Winky', 1], 
         [3, "white", 0.0, 'Lala', 1], 
         [4, "white", 0.0, 'Merlin', 1], 
         [5, "black", 0.0, 'Meriva', 1], 
         [6, "white", 0.0, 'Panda', 1]]) 
    >>> np.where(unicorns[:,1] == "black") 
    (array([0, 1, 4]),) 
    >>> unicorns[np.where(unicorns[:,1] == "black")] 
    array([['1', 'black', '0.0', 'Pinky', '1'], 
    ['2', 'black', '0.0', 'Winky', '1'], 
    ['5', 'black', '0.0', 'Meriva', '1']], 
    dtype='|S8') 
+0

您正在將輸入變換爲字符串數組......堅持使用結構化數組。 –

+0

我不知道到目前爲止。謝謝 ! – tarrasch

4

我不得不修改您的陣列中的位,使其有效的Python代碼。如果我將它轉換得當,那麼我認爲你正在尋找的是:

unicorns[unicorns['color'] == 'white']['name'] 

import numpy as np 

unicorns=[(1, 'black', 0.0, 'Pinky', 1), (2, 'black', 0.0, 'Winky', 1), 
      (3, 'white', 0.0, 'Lala', 1), (4, 'white', 0.0, 'Merlin', 1), 
      (5, 'black', 0.0, 'Meriva', 1), (6, 'white', 0.0, 'Panda', 1), 
      ] 
unicorns = np.array(unicorns, 
        dtype = [('id', '<i4'), 
          ('color', 'S10'), 
          ('val1', '<f4'), 
          ('name', 'S10'), 
          ('val2', '<i4')]) 

print(unicorns['color'] == 'white') 
# [False False True True False True] 

print(unicorns[unicorns['color'] == 'white']['name']) 
# ['Lala' 'Merlin' 'Panda'] 
1

您還可以看看大熊貓是這樣類型的切片和查詢操作的真正真棒。你的問題可以用它來解決:

In [12]: df = pd.DataFrame(unicorns) 

In [13]: df.columns = ['id','color','speed','name','tails'] 

In [14]: df 
Out[14]: 
    id color speed name tails 
0 1 black 0.0 Pinky  1 
1 2 black 0.0 Winky  1 
2 3 white 0.0 Lala  1 
3 4 white 0.0 Merlin  1 
4 5 black 0.0 Meriva  1 
5 6 white 0.0 Panda  1 

In [16]: df[df.color == 'black'] 
Out[16]: 
    id color speed name tails 
0 1 black 0.0 Pinky  1 
1 2 black 0.0 Winky  1 
4 5 black 0.0 Meriva  1 

In [17]: df[df.color == 'black'].name 
Out[17]: 
0  Pinky 
1  Winky 
4 Meriva 
Name: name 
+0

謝謝,我想我會看看它 – tarrasch