考虑以下代码
X=np.matrix([[1,-1,1],[-1,0,1]])
print X.T
'''
[[ 1 -1]
[-1 0]
[ 1 1]]
'''
我想检查转置是否存在< 0解决方案的解决方案。例如,这将意味着检查以下是否有解决方案
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,但显然没有这样的运气
答案 0 :(得分:1)
似乎你的问题等同于询问包含原点的平面以及向量U=r_[1,-1,1]
和V=r_[-1, 0, 1]
是否延伸到三维空间的八分圆,其中所有坐标都是负的。
交叉产品UxV
(或cross(U,V)
与此平面垂直。如果此交叉产品有三个非零组件都具有相同的符号,则其中没有一个法线可以在可怕的八分圆。对于你的数字,我得到所有三个成分都是负数,所以没有解决方案。
<强> [UPDATE] 强>
通常,当法线包含零时会发生棘手的事情:
三个零:您的原始矢量是并行的,或者其中一个为零。选择一个非零,如果所有组件都有相同的符号,那么你有一个解决方案。
两个零:您的平面是X = 0,Z = 0,Y = 0之一。因此,一个维度总是非负的,没有解决方案。
一零:您的平原包括X,Y或Z轴。当且仅当正常的其余两个成分具有不同的符号时,才有解决方案。
答案 1 :(得分:0)
这是您需要的文档:
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