the*_*tna 2 python numpy logical-operators
python中是否有任何方法可以跨行或列计算2D数组的元素OR或AND运算?
例如,对于以下数组,跨行的元素OR运算将产生向量[1, 0, 0, 0, 0, 0, 0, 0].
array([[1, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)
numpy的有logical_or,logical_xor并且logical_and其中有一个reduce方法
>> np.logical_or.reduce(a, axis=0)
array([ True, False, False, False, False, False, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
正如你在示例中看到的那样,他们强迫booldtype,所以如果你需要uint8你必须在最后投掷.
由于bools存储为字节,因此您可以使用廉价的视图广播.
使用axis关键字,您可以选择沿哪个轴减少.可以选择多个轴
>> np.logical_or.reduce(a, axis=1)
array([ True, True, True, True], dtype=bool)
>>> np.logical_or.reduce(a, axis=(0, 1))
True
Run Code Online (Sandbox Code Playgroud)
该keepdims关键字对广播很有用,例如查找数组中行和列的所有"十字"> = 2b
>>> b = np.random.randint(0,10, (4, 4))
>>> b
array([[0, 5, 3, 4],
[4, 1, 5, 4],
[4, 5, 5, 5],
[2, 4, 6, 1]])
>>> rows = np.logical_and.reduce(b >= 2, axis=1, keepdims=True)
# keepdims=False (default) -> rows.shape==(4,) keepdims=True -> rows.shape==(4, 1)
>>> cols = np.logical_and.reduce(b >= 2, axis=0, keepdims=True)
# keepdims=False (default) -> cols.shape==(4,) keepdims=True -> cols.shape==(1, 4)
>>> rows & cols # shapes (4, 1) and (1, 4) are broadcast to (4, 4)
array([[False, False, False, False],
[False, False, False, False],
[False, False, True, False],
[False, False, False, False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
注意到&操作员的轻微滥用bitwise_and.因为对bools的影响是相同的(实际上试图and在这个地方使用会抛出异常)这是常见的做法
作为@ajcr指出受欢迎np.any和np.all有速记np.logical_or.reduce和np.logical_and.reduce.但请注意,存在细微差别
>>> np.logical_or.reduce(a)
array([ True, False, False, False, False, False, False, False], dtype=bool)
>>> np.any(a)
True
Run Code Online (Sandbox Code Playgroud)
要么:
如果你想坚持uint8并且知道你的所有参赛作品都是0和1你可以使用bitwise_and,bitwise_or和bitwise_xor
>>> np.bitwise_or.reduce(a, axis=0)
array([1, 0, 0, 0, 0, 0, 0, 0], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)