我有一个numpy数组:
groups=np.array([('Species1',), ('Species2', 'Species3')], dtype=object)
。
当我问np.where(groups == ('Species2', 'Species3'))
或什至np.where(groups == groups[1])
时,我会得到一个空的答复:(array([], dtype=int64),)
这是为什么,如何获取此类元素的索引?
答案 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]),)