如何在numpy数组中找到元组的索引?

时间:2019-06-27 09:51:08

标签: python numpy

我有一个numpy数组:

groups=np.array([('Species1',), ('Species2', 'Species3')], dtype=object)

当我问np.where(groups == ('Species2', 'Species3'))或什至np.where(groups == groups[1])时,我会得到一个空的答复:(array([], dtype=int64),)

这是为什么,如何获取此类元素的索引?

4 个答案:

答案 0 :(得分:1)

是的,您可以搜索它,但不能使用np.where进行搜索,而可以使用for循环和if-else的帮助

for index,var in enumerate(groups):
    if var == ('Species2', 'Species3'):
        print("('Species2', 'Species3') -->>", index)
    else:
        print("('Species1',) -->>", index)

输出

('Species1',) -->> 0
('Species2', 'Species3') -->> 1

答案 1 :(得分:1)

这里的问题可能是实现array.__contains__()的方式。 参见here。基本上,问题是

print(('Species2', 'Species3') in groups)

打印False。 但是,如果您想使用numpy.where函数,而不要像另一个答案所建议的那样使用for循环,则最好以某种方式构造一个合适的真值掩码。例如

x = np.array(list(map(lambda x: x== ('Species2', 'Species3'), groups)))
print(np.where(x))

给出正确的结果。不过,可能会有更优雅的方式。

答案 2 :(得分:1)

这并不意味着在使用

时从组中搜索元组('Species2','Species3')

.strip

这意味着,如果您具有这样的完整数组,则分别搜索“ Species2”和“ Species3”

np.where(groups == ('Species2', 'Species3'))

答案 3 :(得分:0)

您的数组有两个元组:

int w = 1;
int b = 2000;
while(w <= b) {

  //Do various logic here

  //Handle incrementing
  if( w < 50 ) {
    w++;
  } else if ( w == 50 ) {
    w = 100;
  } else if ( w + 100 < b ) {
    w += 100;
  } else if ( w < b ) {
    w = b;
  } else {
    break;
  }
}

但是要小心这种定义。如果元组的大小相同,则数组将具有不同的形状,并且元素将不再是元组。

In [53]: groups=np.array([('Species1',), ('Species2', 'Species3')], dtype=object)                    
In [54]: groups                                                                                      
Out[54]: array([('Species1',), ('Species2', 'Species3')], dtype=object)
In [55]: groups.shape                                                                                
Out[55]: (2,)

In [56]: np.array([('Species1',), ('Species2',), ('Species3',)], dtype=object) Out[56]: array([['Species1'], ['Species2'], ['Species3']], dtype=object) In [57]: _.shape Out[57]: (3, 1) 的任何使用仅与为其提供的布尔数组一样好。 where返回空,因为相等性测试会产生所有where

False

如果我使用列表理解来比较组元素:

In [58]: np.where(groups == groups[1])                                                               
Out[58]: (array([], dtype=int64),)
In [59]: groups == groups[1]                                                                         
Out[59]: array([False, False])

但是对于这种事情,列表同样会很好

In [60]: [g == groups[1] for g in groups]                                                            
Out[60]: [False, True]
In [61]: np.where([g == groups[1] for g in groups])                                                  
Out[61]: (array([1]),)