Python Numpy字符串标量比较

Python Numpy字符串标量比较,python,arrays,numpy,filter,comparison,Python,Arrays,Numpy,Filter,Comparison,我在Numpy身上看到了一种奇怪的行为,或者我就是不擅长 我有一个带有字符串字段的结构化数组。现在我想根据该字段过滤数据。我的理解是,这将起作用: data['somefield'][data['filterfield'] == 'someconstant'] 但奇怪的是,事实并非如此。我假定 data['filterfield'] == 'someconstant' 将生成一个布尔值数组。但它没有,它返回一个布尔值(不是它的数组)。因此,使用 data['filterfield'] ==

我在Numpy身上看到了一种奇怪的行为,或者我就是不擅长

我有一个带有字符串字段的结构化数组。现在我想根据该字段过滤数据。我的理解是,这将起作用:

data['somefield'][data['filterfield'] == 'someconstant']
但奇怪的是,事实并非如此。我假定

data['filterfield'] == 'someconstant'
将生成一个布尔值数组。但它没有,它返回一个布尔值(不是它的数组)。因此,使用

data['filterfield'] == full(data.shape,'someconstant',dtype=data['filterfield'].dtype)

按预期工作,但这是一个麻烦和容易出错。这是预期的行为吗?如果是,是否有一种较短的方法来创建字符串数组

数据['filterfield']
可能是字符串列表
np.char
对这种类型的数组有一组操作。数字数组的普通
array==scalar
测试似乎不适用于这种类型的数组
np.char.equal(c1,c2)
比较两个字符数组,并且没有规定其中一个是普通字符串

因此,生成另一个字符串数组的方法是正确的。但它可以更简单(由于广播):

如果默认字符类型与
x
匹配,则数组('two')也可能工作。我在python3中做了这个测试,所以
使用
np.char
函数可能还有其他选项,但这是简单明了的。

data['filterfield']=='someconstant'
肯定会生成布尔值,而不是数组!如果执行
data['somefield'][data['filterfield']=='someconstant']
,它会理解为类似
data['somefield'][True]
是的,我也这么认为。但我从来不知道np.array('two',stype='S')可以工作。我认为它会创建一个字符数组。在某些上下文(
loadtxt
?)中,简单的
S
表示
S1
,1个字符。但显然,在这种用法中,它选择了足够的字符。
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)