2012-09-26 44 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