矩阵

时间:2017-05-06 20:36:19

标签: python matrix boolean operations

我需要在数组中测试一个布尔值,并根据答案在矩阵上应用元素运算。我似乎得到了ROW的布尔答案而不是单个元素本身。我如何测试并获得每个元素的答案?

我有一个概率矩阵

probs = np.array([[0.1, 0.2, 0.3, 0.3, 0.7],
                  [0.1, 0.2, 0.3, 0.3, 0.7],
                  [0.7, 0.2, 0.6, 0.1, 0.0]])

和测试数组矩阵

tst = ([False, False, True, True, False],
       [True, False, True, False, False],
       )
t = np.asarray(tst).astype('bool')

我编写的这段代码输出了答案,但显然是测试整行,因为一切都是假的。

for row in tst:
    mat = []
    for row1 in probs:
        temp = []
        if row == True:
            temp.append(row1)
        else: temp.append(row1-1)
        mat.append(temp)

mat
Out[42]: 
[[array([-0.9, -0.8, -0.7, -0.7, -0.3])],
 [array([-0.9, -0.8, -0.7, -0.7, -0.3])],
 [array([-0.3, -0.8, -0.4, -0.9, -1. ])]]

我需要新的矩阵

[[-0.9, -0.8, 0.3, 0.3, -0.3],
 [-0.9, -0.8, 0.3, 0.3, -0.3],
 [-0.3, -0.8, 0.6, 0.1, -1]

为tst中的第一个数组。非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如果测试为True,则需要保持值不变,否则减去1

你的循环不起作用,因为你将列表与布尔值进行比较。之后,您将整行减去1(将所有元素减去1)

我的解决方案:将布尔行减去值行,但反转True和False(如果为True,则不减去,如果为False,则减去):

for row in tst:
    mat = []
    for row1 in probs:
        mat.append(row1-[not v for v in row])

    print(np.asarray(mat))

打印(对于每次迭代)(请注意,由于您将2个真值表与矩阵组合在一起,因此有2个结果):

[[-0.9 -0.8  0.3  0.3 -0.3]
 [-0.9 -0.8  0.3  0.3 -0.3]
 [-0.3 -0.8  0.6  0.1 -1. ]]
[[ 0.1 -0.8  0.3 -0.7 -0.3]
 [ 0.1 -0.8  0.3 -0.7 -0.3]
 [ 0.7 -0.8  0.6 -0.9 -1. ]]

(我根本不是numpy专家,对不起,如果这很笨拙,欢迎评论)

答案 1 :(得分:0)

你不需要在这里循环。你有一个数组和一个相应的掩码数组。

probs[np.invert(tst)]-=1.

面具将为您提供真实的价值。你想要错误的值,所以反转tst数组。

# This would be a longer version, if you are not familiar with the synthax above
probs[np.invert(tst)]=probs[np.invert(tst)]-1.

如果你想创建一个新的numpy数组(你在代码中创建了一个numpy-arrays列表),它将以这种方式工作。

# copy the numpy array
mat=np.copy(probs)
mat[np.invert(tst)]=probs[np.invert(tst)]-1

我建议你首先看一下视图初学者教程,如果你知道例如列表和numpy-arrays之间的区别以及如何处理它们,编程将会容易得多。

https://www.scipy.org/scipylib/faq.html#what-advantages-do-numpy-arrays-offer-over-nested-python-lists https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

或简短说明

Python List vs. Array - when to use?