试试这个。
>>> a
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
>>> b
array([[4, 5],
[6, 7]])
添加的轴线,使得a
可被广播到b
并测试equivalancy
>>> c = a == b[:, np.newaxis, :]
>>> c.shape
(2, 5, 2)
使用np.all
沿着最后轴线随后沿着结果的最后轴np.any
。
>>> c = np.all(c, axis = -1)
>>> np.any(c, axis = (-1))
array([ True, True], dtype=bool)
>>> d
array([[4, 5],
[9, 8]])
>>> e = a == d[:, np.newaxis, :]
>>> e = np.all(e, axis = -1)
>>> np.any(e, axis = (1,2))
array([ True, False], dtype=bool)
>>>
>>> f
array([[ 2, 3],
[ 8, 10]])
>>> g = a == f[:, np.newaxis, :]
>>> g = np.all(g, axis = -1)
>>> g = np.any(g, axis = -1)
>>> g
array([ True, False], dtype=bool)
>>>
尝试以不同的方式 - 与解释:
>>> a
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
>>> f
array([[ 2, 3],
[ 8, 10]])
- 添加的轴线
a
(形状将是(5,1,2)),使得f
和 a
是可广播。
- 在等效操作中,与每个1×2的
a
数组相比,f
的每个1x2数组将为 。
- 的对比将发生沿的新
a
第三轴。
结果是一个5x2x2布尔数组(5x1x2 op 2,2 - > 5x2x2)。
>>> g = a[:, np.newaxis, :] == f
>>> g.shape
(5, 2, 2)
- 你有兴趣在1x2的阵列是相等的任何一点 - 沿第三轴线。
- 要相等,元素需要为
True
。沿着第三轴使用np.all
结果是5x2布尔数组。
- 列表示每个1×2阵列
f
与每个1×2阵列a
的比较。
f[0] (array([2, 3]))
comaparisons的第一列和f[1]
的第二列比较。
>>> g.all(axis = -1)
array([[False, False],
[ True, False],
[False, False],
[False, False],
[False, False]], dtype=bool)
以确定是否任一f
1x2的阵列中a
发现, 使用np.any
沿第一轴线。
>>> np.any(g.all(axis = -1), axis = 0)
array([ True, False], dtype=bool)
以确定是否任何a
1x2的阵列是等于f
任一1×2阵列, 使用np.any
沿第二轴线。
>>> np.any(g.all(axis = -1), axis = 1)
array([False, True, False, False, False], dtype=bool)
>>>
>>> np.any(g.all(axis = -1), axis = 1, keepdims = True)
array([[False],
[ True],
[False],
[False],
[False]], dtype=bool)
最后np.zero
或np.where
可以给你其中f
或者1x2的元件中发现的a
行(多个)的索引 - >行1。
>>> np.nonzero(np.any(g.all(axis = -1), axis = 1))
(array([1]),)
>>>>>> np.nonzero(np.any(g.all(axis = -1), axis = 1, keepdims = True))
(array([1]), array([0]))
广播:
完美,这正是我需要的。我的代码可能是最不可能的'pythonic',但它完成了工作。感谢您提供如此快速的回应。 – Ryan 2014-08-28 21:05:06
完全没问题!很高兴答案对你有用。 – 2014-08-28 21:09:09