在比较两个numpy数组时,如何创建true和false值列表?

时间:2016-10-07 00:29:55

标签: python arrays numpy

我使用列表推导从以下数组中创建了一个真值和假值列表:

array([[ True,  True, False, ..., False,  True, False],
   [ True,  True, False, ..., False,  True,  True],
   [ True, False,  True, ..., False,  True, False],
   ..., 
   [ True,  True, False, ...,  True,  True, False],
   [ True,  True, False, ...,  True,  True, False],
   [ True,  True, False, ...,  True,  True, False]], dtype=bool)

(它有50 X 85尺寸)

这是我的清单理解:

list_1 = [features[index] & features[i] for i in features]

其中index是一个整数,(在我的情况下,它是14)。

这就是print(features[index])的样子:

[ True  True False False False False False False  True False False  True
  True False False False False  True  True False False False  True False
  True  True  True  True False False  True  True  True  True  True False
 False False False False False False False False  True  True False False
 False  True  True False  True False  True False  True False  True  True
 False  True  True  True False False  True  True False False  True False
 False  True  True False False  True  True False]

以及print(features[i])的示例如下:

[False False False False  True False  True False  True False False False
 False False False False False False False  True False False False False
 False  True False  True False False  True False False False False  True
 False False False False  True  True  True False False  True  True  True
 False False False  True  True False False False False False False False
  True  True  True False False  True False  True False  True False False
  True  True  True False False  True False False]

因此,两个阵列似乎长度相同。但是,当我将索引数组与功能数组中的所有其他数组进行比较时,我收到以下错误:

IndexError: index 54 is out of bounds for axis 0 with size 50

问题:在将features[index]数组与 ALL 其他数组进行比较时,如何创建真值和假值列表? #34;阵列? 最终,列表应由真值组成,其中features[index]中的元素与其他数组的 ALL 中的其他元素匹配。因此,列表中不太可能存在许多真值。该列表应由假值组成,其中features[index]中的元素与要素数组的数组的 ANY 中的元素不匹配。

2 个答案:

答案 0 :(得分:0)

假设我的理解是正确的,你只需要:

numpy.logical_and.reduce(features[index] == features)

这里我们首先使用:

生成所有行和feature[index]之间的匹配
features[index] == features

然后,如果所有j <{1}} features[index][j] == features[j],我们会为列i减少有效测试的矩阵

举个例子:

>>> features = numpy.asarray(numpy.random.randint(2, size=(5, 10)), dtype=bool)
>>> features
array([[False,  True,  True,  True, False, False,  True, False, False,
        False],
       [ True, False,  True,  True,  True,  True,  True,  True, False,
         True],
       [ True, False,  True, False, False,  True,  True,  True,  True,
         True],
       [False, False,  True, False,  True, False, False,  True, False,
         True],
       [False,  True,  True,  True, False,  True, False,  True,  True,
         True]], dtype=bool)
>>> numpy.logical_and.reduce(features[3] == features)
array([False, False,  True, False, False, False, False, False, False, False])

答案 1 :(得分:0)

使用您的数组摘录,我只会在索引中遇到同样的错误:

In [726]: features
Out[726]: 
array([[ True,  True, False,  True, False,  True, False],
       [ True,  True, False,  True, False,  True,  True],
       [ True, False,  True,  True, False,  True, False],
       [ True,  True, False,  True,  True,  True, False],
       [ True,  True, False,  True,  True,  True, False],
       [ True,  True, False,  True,  True,  True, False]], dtype=bool)
In [727]: [features[i] for i in features]
/usr/local/bin/ipython3:1: VisibleDeprecationWarning: boolean index did not match indexed array along dimension 0; dimension is 6 but corresponding boolean dimension is 7
...
IndexError: index 6 is out of bounds for axis 0 with size 6

[... for i in features]遍历features行。因此,features[i]正尝试使用第i行功能对features行进行索引。

正确的迭代是:

In [730]: [features[0] & features[i] for i in range(features.shape[0])]
Out[730]: 
[array([ True,  True, False,  True, False,  True, False], dtype=bool),
 array([ True,  True, False,  True, False,  True, False], dtype=bool),
 array([ True, False, False,  True, False,  True, False], dtype=bool),
 array([ True,  True, False,  True, False,  True, False], dtype=bool),
 array([ True,  True, False,  True, False,  True, False], dtype=bool),
 array([ True,  True, False,  True, False,  True, False], dtype=bool)]

甚至是[features[0] & i for i in features]

但是你不需要在列表理解中这样做。 features[i]具有形状(7,),可以针对整个功能(6,7)

进行广播
features[0] & features

这解决了错误,但没有解决您希望如何与features[index]进行比较的问题。我还没有完全消化它。显示features[i]应与features[j]进行比较的方式。