输入:
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时才起作用(因此进行转换)。
答案 0 :(得分:6)
带有numpy数组的<
进行逐元素比较。这意味着它将返回一个数组,其中存在一个True
且条件为true的数组,否则为False
。 np.require
行在这里是必需的,因此它实际上使用了NumPy数组。如果您将np.require
和data
预先转换为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])
因此,类型强制发生在布尔数组上,然后执行加法运算。