【问题标题】:Numpy to check if a solution exists such that each row is < 0?Numpy 检查是否存在解决方案,使得每行 < 0?
【发布时间】:2013-05-24 00:08:14
【问题描述】:

考虑下面的代码

X=np.matrix([[1,-1,1],[-1,0,1]])

print X.T
'''
[[ 1 -1]
 [-1  0]
 [ 1  1]]
'''

我想检查是否存在转置具有

1*y1 + -1*y2 < 0
-1*y1 + 0*y2 < 0
1*y1 + 1*y2 < 0

尝试阅读 http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.solve.html#numpy.linalg.solve 但显然没有这样的运气

【问题讨论】:

    标签: python matrix numpy


    【解决方案1】:

    您的问题似乎等同于询问包含原点以及向量 U=r_[1,-1,1]V=r_[-1, 0, 1] 的平面是否延伸到所有坐标均为负的 3-d 空间的八分圆。

    叉积UxV(或cross(U,V) 是这个平面的法线。如果这个叉积有三个非零分量都具有相同的符号,那么它的任何法线都不可能在可怕的八分圆中。对于你的数字,我得到所有三个分量都是负数,所以没有解决方案。

    [更新]

    一般来说,当法线包含零时会发生棘手的事情:

    三个零:你的原始向量是平行的,或者其中一个是零。选择一个不为零的,如果所有组件都具有相同的符号,那么您就有了解决方案。

    双零:您的平面是 X=0、Z=0、Y=0 之一。因此,一维总是非负的,没有解。

    一个零:您的平面包括 X、Y 或 Z 轴。当且仅当法线的其余两个分量具有不同的符号时,才有解决方案。

    【讨论】:

    • 有没有通用的方法来检查这个?当我尝试这种方法时,它说如果一块长度为 1,则交叉方法不起作用,有时它只给我一个 True 或 False 与一组 True/False 值
    • 如果长度大于 3 也不起作用,例如 U=[-1, 1, 1, -1] V=[0, 1, 0, -1 ]
    • 叉积仅适用于 3 向量。有其他维度的概括(阅读Levi-Civita symbols),我怀疑检查结果张量的符号会有所帮助。但我没有仔细考虑过这个。
    【解决方案2】:

    这里是您需要的文档:

    numpy apply along axis

    import numpy as np:
    def func(b,y1,y2):
        a = b.T
        if a[0]*y1 + a[1]*y2 < 0:
            return True
        else:
            return False
    np.apply_along_axis(func,0,X,y1,y2)
    

    现在假设您希望 y1 为 -1,y2 为 3:

    >>> np.apply_along_axis(func,0,X,-1,3)
    array([ True, False, False], dtype=bool)
    

    所以这意味着转置第一行(这将是正常的第一列)适用于您的算法,第二和第三不!

    这是一个任意数量的 Y 的函数,就像你想要的一样大的矩阵:

    def func(b,*args):
        a = b.T
        total = [a[i]*args[i] for i in range(len(args)-1)]
        if sum(total) < 0:
            return True
        else:
            return False
    

    【讨论】:

    • 这将更适合作为评论。
    • 不一致?什么意思?
    • 这也不能满足我的需要
    • 您刚刚对其进行了编辑,使其不再不一致。你有-1*y1 - 0*y2 &lt; 0,它没有意义,但你修复了它,所以现在我得到你想要的,我会编辑它
    • 现在我编辑了它,因为我知道你的意思是用一个例子表明它有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多