NumPy,为什么等式检查对一组对象不起作用?

Sau*_*tro 3 python arrays numpy equality object

使用以下对象数组:

a = np.array([[1], [1, 2], [1, 2, 3], [1], [1]], dtype=object)
b = np.array([(1,), (1, 2), (1, 2, 3), (1,), (1,)], dtype=object)
Run Code Online (Sandbox Code Playgroud)

以下等式检查不起作用:

a==[1]
#array([False, False, False, False, False], dtype=bool)

b==(1,)
#array([False, False, False, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

如果我改用字符串:

c = np.array(['[1]', '[1, 2]', '[1, 2, 3]', '[1]', '[1]'])
Run Code Online (Sandbox Code Playgroud)

平等检查有效:

c == '[1]'
#array([ True, False, False,  True,  True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

为什么数组检查表现得那样?

如果我们迭代a或b并执行检查,它也会给出预期的结果:

[i==[1] for i in a]
#[True, False, False, True, True]

[i==(1,) for i in b]
#[True, False, False, True, True]
Run Code Online (Sandbox Code Playgroud)

谢谢!

use*_*ica 5

NumPy旨在在许多情况下自动将类似数组的对象视为数组.在这里,NumPy看到[1]并且(1,)是类似数组的对象并应用广播规则.两侧的长度1轴扩展到另一个对象的相应轴的长度,如果一个对象的尺寸小于另一个对象,则缺少的尺寸在左侧填充,另一个对象的长度在这些尺寸中.从而,

a == [1]
Run Code Online (Sandbox Code Playgroud)

给出了相同的结果

a == numpy.array([1, 1, 1, 1, 1])
Run Code Online (Sandbox Code Playgroud)

这是一个5 False秒的数组.