我看到Numpy出现了一种奇怪的行为,或者我对它很不满意。
我有一个带有字符串字段的结构化数组。现在我想根据该字段过滤数据。我的理解是,这会起作用:
data['somefield'][data['filterfield'] == 'someconstant']
但奇怪的是,它没有。我假设
data['filterfield'] == 'someconstant'
将生成一个布尔数组。但它没有,它返回一个布尔值(不是它的数组)。所以不要那样,使用
data['filterfield'] == full(data.shape,'someconstant',dtype=data['filterfield'].dtype)
按预期工作,但它很麻烦且容易出错。这是预期的行为吗?如果是这样,是否有更短的方法来创建一个字符串数组?
答案 0 :(得分:1)
data['filterfield']
可能是一个字符串列表。 np.char
对此类数组有一组操作。看起来数字数组的普通array==scalar
测试不适用于这种类型的数组。 np.char.equal(c1,c2)
比较两个char数组,并且没有为其中一个是纯字符串的规定。
所以你的方法,生成另一个字符串数组,是正确的。但它可以更简单(由于广播):
In [326]: x=np.array([(1,'one'),(2,'two'),(3,'three')],dtype='int,S10')
In [327]: x['f1']
Out[327]:
array([b'one', b'two', b'three'],
dtype='|S10')
In [328]: x['f1']==np.array('two',dtype='S')
Out[328]: array([False, True, False], dtype=bool)
如果默认字符类型与np.array('two')
匹配,则 x
也可能有效。我在python3
进行了此测试,因此'
使用np.char
函数可能还有其他选项,但这很简单直接。