这行的'<'是做什么?:data + = dt <b

时间:2018-07-13 18:38:36

标签: python arrays numpy operators

输入:

dt    = [6,7,8,9,10]
data  = [1,2,3,4,5]

b     = 8.0
b     = np.require(b, dtype=np.float)

data  += dt  < b
data

输出:

array([2, 3, 3, 4, 5])

我尝试输入其他数字,但仍然不知道那里的“ <”是什么。 另外,它似乎仅在b为np.float时才起作用(因此进行转换)。

3 个答案:

答案 0 :(得分:6)

带有numpy数组的<进行逐元素比较。这意味着它将返回一个数组,其中存在一个True且条件为true的数组,否则为Falsenp.require行在这里是必需的,因此它实际上使用了NumPy数组。如果您将np.requiredata预先转换为dt,则可以删除np.array

然后将结果(逐个元素)添加到数字数组。在这种情况下,True等于1,False等于零。

>>> dt < b  # which elements are smaller than b?
array([ True,  True, False, False, False])

>>> 0 + (dt  < b)  # boolean arrays in arithmetic operations with numbers
array([1, 1, 0, 0, 0])

因此,如果data中的元素小于8,它会向dt的每个元素加1。

答案 1 :(得分:2)

dt是一个列表:

In [50]: dt    = [6,7,8,9,10]
In [51]: dt < 8
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-51-3d06f93227f5> in <module>()
----> 1 dt < 8

TypeError: '<' not supported between instances of 'list' and 'int'
没有为列表定义

<.__lt__)。

但是,如果比较的一个元素是ndarray,则适用__lt__的numpy定义。 dt变成一个数组,并逐个元素地进行比较。

In [52]: dt < np.array(8)
Out[52]: array([ True,  True, False, False, False])
In [53]: np.array(dt) < 8
Out[53]: array([ True,  True, False, False, False])

numpy数组操作还解释了data +=部分:

In [54]: data  = [1,2,3,4,5]          # a list
In [55]: data + (dt < np.array(8))    # list=>array, and boolean array to integer array
Out[55]: array([2, 3, 3, 4, 5])
In [56]: data
Out[56]: [1, 2, 3, 4, 5]
In [57]: data += (dt < np.array(8))
In [58]: data
Out[58]: array([2, 3, 3, 4, 5])

实际上,我对+= data从列表更改为数组感到有些惊讶。这意味着data+=...已作为分配实现:

data = data + (dt <np.array(8))

通常+的列表是串联的:

In [61]: data += ['a','b','c']
In [62]: data
Out[62]: [1, 2, 3, 4, 5, 'a', 'b', 'c']
# equivalent of: data.extend(['a','b','c'])

通常可以在数组上下文中使用列表,但是最好将对象数组制成数组,这样您就可以获得这些隐式(有时是意外的)转换。

答案 2 :(得分:1)

这只是等效功能numpy.less()

的别名(或快捷方式或方便标记)
>>> df
          date
s1  2017/01/03
s2  2017/01/03
s3  2017/01/04
s1  2017/01/04
s2  2017/01/04
s3  2017/01/05

df['date_count'] = df.date.map(df.groupby('date').size())

>>> df
          date  date_count
s1  2017/01/03           2
s2  2017/01/03           2
s3  2017/01/04           3
s1  2017/01/04           3
s2  2017/01/04           3
s3  2017/01/05           1

让我们看看在这种情况下如何将该布尔数组添加到非布尔数组中。可能是由于类型强制

In [116]: arr1 = np.arange(8)
In [117]: scalar = 6.0

# comparison that generates a boolean mask
In [118]: arr1 < scalar
Out[118]: array([ True,  True,  True,  True,  True,  True, False, False])

# same operation as above 
In [119]: np.less(arr1, scalar)
Out[119]: array([ True,  True,  True,  True,  True,  True, False, False])

因此,类型强制发生在布尔数组上,然后执行加法运算。