This may be related to #3016. As I understand it arr.__contains__(item) is implemented as (arr == item).any(). Due to spurious broadcasting this leads to [5] in array([None, 4, [5]) -> False and [5] in array([None, 5, [4]) -> True Surely, that can't be right. I'm on Python3.6 and numpy1.13.