我需要在数组中测试一个布尔值,并根据答案在矩阵上应用元素运算。我似乎得到了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中的第一个数组。非常感谢您的帮助!
答案 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
或简短说明