我刚遇到以下问题。从两个数组开始,执行布尔比较,如:
In [47]: a1 = np.random.randint(0,10,size=1000000)
In [48]: a2 = np.random.randint(0,10,size=1000000)
In [52]: a1[:,None] == a2
Out[52]: False
返回布尔值而不是布尔数组,而:
In [62]: a1 = np.random.randint(0,10,size=10000)
In [63]: a2 = np.random.randint(0,10,size=10000)
In [64]: a1[:,None] == a2
Out[64]:
array([[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
...,
[False, False, False, ..., False, False, False],
[ True, False, False, ..., False, False, False],
[False, False, False, ..., True, False, False]], dtype=bool)
按预期工作。这是与阵列大小有关的问题吗?无论大小如何,对阵列的单个维度进行简单比较都可以。
In [65]: a1 = np.random.randint(0,10,size=1000000)
In [66]: a2 = np.random.randint(0,10,size=1000000)
In [67]: a1 == a2
Out[67]: array([False, False, False, ..., False, False, True], dtype=bool)
任何人都可以重现这个问题吗?我在Numpy 1.9.2和Python 2.7.3上。
编辑:只需更新到Numpy 1.11,但问题仍然存在。
答案 0 :(得分:8)
当我尝试比较时,我收到警告:
// force reflow
此警告在NumPy的代码here中触发:
[...]/__main__.py:1: DeprecationWarning: elementwise == comparison failed;
this will raise an error in the future.
if __name__ == '__main__':
因为if (result == NULL) {
/*
* Comparisons should raise errors when element-wise comparison
* is not possible.
*/
/* 2015-05-14, 1.10 */
PyErr_Clear();
if (DEPRECATE("elementwise == comparison failed; "
"this will raise an error in the future.") < 0) {
return NULL;
}
而到达此分支,其中result == NULL
是NumPy 尝试执行请求的操作时发生的事情(元素相等性检查,涉及广播两个数组)。
为什么此操作失败并返回result
?很可能是因为NumPy需要为数组分配一个巨大的内存块;足以容纳10个 12 布尔。这大约是931 GB:它无法执行此操作并返回NULL
。