如何通过numpy广播来防止添加两个数组?

Riz*_*zar 14 python numpy

Numpy拥有非常强大的广播机制.它甚至可以添加1x2和2x1阵列而不会发出任何警告.我不喜欢这样的行为:99%的概率这样的添加是我的错误的结果,我想要抛出异常.问题:是否有类似的东西:

numpy.safe_add(A,B)
Run Code Online (Sandbox Code Playgroud)

仅当A和B具有完全相同的形状时才有效?

HYR*_*YRY 6

您可以定义一个子类,ndarray用于在计算后检查结果的形状.执行计算,我们检查结果的形状,如果它与操作数的形状不同,则会引发异常:

import numpy as np

class NoBCArray(np.ndarray):

    def __new__(cls, input_array, info=None):
        obj = np.asarray(input_array).view(cls)
        return obj

    def __array_wrap__(self, out_arr, context=None):
        if self.shape != out_arr.shape:
            raise ValueError("Shape different")
        return np.ndarray.__array_wrap__(self, out_arr, context)

a = NoBCArray([[1, 2]])
b = NoBCArray([[3], [4]])

a + b # this will raise error
Run Code Online (Sandbox Code Playgroud)

如果要在计算之前检查,则需要换行__add__:

def check_shape(opfunc):
    def checkopfunc(self, arr):
        if self.shape != arr.shape:
            raise ValueError("Shape different before calculation")
        else:
            return opfunc(self, arr)
    return checkopfunc

class NoBCArray(np.ndarray):

    __add__ = check_shape(np.ndarray.__add__)
Run Code Online (Sandbox Code Playgroud)