将数组与python中的其他两个数组进行比较

时间:2016-07-27 09:50:03

标签: python arrays python-3.x numpy

我有一组3个阵列,我会相互比较。 数组a包含一组值,数组b和c的值应该部分相同。

如果说a[0] == b[0]而不是c[0]总是错误的值

为了更好的解释,我试着表明我的意思。

import numpy as np

a = np.array([2, 2, 3, 4])
b = np.array([1, 3, 3, 4])
c = np.array([2, 2, 4, 3])

print(a == b)
# return: [False False True  True]
print(a == c)
# return: [True True False False]

你可以看到两组中我有两个真和两个假。所以如果其中一个是真的那么总数应该是真的。当我执行以下操作时,我得到一个数组的True / False。而答案就是我想要的......

print((a == b).all())
# return: False
print((a == c).all())
# return: False

print(a.all() == (b.all() or c.all()))
# return: True

当我制作数组b和c以便我有一个vallue时,在两种情况下都是错的,我应该以一个错误结束

import numpy as np

a = np.array([2, 2, 3, 4])
b = np.array([1, 3, 3, 4])
c = np.array([5, 2, 4, 3])


print(a == b)
# return: [False False True  True]
print(a == c)
# return: [False True False False]

print((a == b).all())
# return: False
print((a == c).all())
# return: False

到目前为止很好

print(a.all() == (b.all() or c.all()))
# return: True

这部分不好这个应该是假的!! 我如何得到这样的函数或者这样的函数,以便在abc中存在相同的值时,以{1}}或<{p>

编辑: 关于a[0] == b[0]的解释比c[0]: 我有一个python函数,其中阶段信息进入并且必须执行一些操作。 在此之前我想检查我是否需要处理一组虚数值或带有相位角的数组。我想在做某事之前检查一下。问题是相位角,因为右侧是反相+/- pi。所以对于每个价值我有两个选择。并且大多数时候它是独家的,但在+/- pi / 2的情况下,它不是因为两者都是真的而且也很好......

4 个答案:

答案 0 :(得分:2)

您想要一个合乎逻辑的OR

np.logical_or(a==b, a==c).all()

答案 1 :(得分:1)

根据你的例子和解释,我想你想要的是:

  

对于每个职位,完全 bc中的一个与a具有相同的价值

如果是这种情况,可以使用以下代码完成:

def is_exclusively_jointly_same(a, b, c):
    return np.logical_xor(a==b, a==c).all() # or use ^ below
    # return ((a==b)^(a==c)).all()

^是独占或(XOR)运算符,当且仅当其参数中的一个为True时才会返回True

所以表达式(a==b)^(a==c)表示a==ba==c,但不是两者。然后.all()检查数组中的所有位置是否为真。

示例:

>>> a=np.array([1,2,3,4,5])
>>> b=np.array([1,2,0,0,5])
>>> c=np.array([0,0,3,4,0])
>>> is_exclusively_jointly_same(a, b, c)
True

>>> a=np.array([1,2,3,4,5])
>>> b=np.array([0,2,0,0,5]) # First value both not 1
>>> c=np.array([0,0,3,4,0])
>>> is_exclusively_jointly_same(a, b, c)
False

>>> a=np.array([1,2,3,4,5])
>>> b=np.array([1,2,0,0,5]) # First value both 1
>>> c=np.array([1,0,3,4,0])
>>> is_exclusively_jointly_same(a, b, c)
False

如果您想要的是:

  

对于每个职位,至少 bc中的一个应与[{1}}具有相同的值

,然后您需要更改为OR而不是XOR,如下所示:

a

示例:

>>> a=np.array([1,2,3,4,5])
>>> b=np.array([1,2,0,0,5])
>>> c=np.array([0,0,3,4,0])
>>> is_jointly_same(a, b, c)
True

>>> a=np.array([1,2,3,4,5])
>>> b=np.array([0,2,0,0,5]) # First value both not 1
>>> c=np.array([0,0,3,4,0])
>>> is_jointly_same(a, b, c)
False

>>> a=np.array([1,2,3,4,5])
>>> b=np.array([1,2,0,0,5]) # First value both 1
>>> c=np.array([1,0,3,4,0])
>>> is_jointly_same(a, b, c)
True

这里的关键是,def is_jointly_same(a, b, c): return np.logical_or(a==b, a==c).all() # or use | below # return ((a==b) | (a==c)).all() 应该一次作为最终聚合器,当已经计算出每个单独的值时。因此,当您发现多次应用.all()时,您应该担心。

答案 2 :(得分:0)

您可以尝试这种方式:

(a==b).all() or (a==c).all()

答案 3 :(得分:-1)

  

实际上all()函数如果iterable的所有元素都为true(或者iterable为空),则返回True。   在编程语言中,0被认为是假,任何其他整数都被认为是真的。   所以在你的数组a,b,c中,每个元素都是非零的,a.all(),b.all()和c.all()它们都是单独返回true,所以最后你会变成真的。