过滤我们的矩阵元素,其中/ both / both都不是非零的?

时间:2015-09-26 16:02:34

标签: python arrays numpy

我有两个numpy数组AB。我想创建数组ApBp,以便ApBp都是AB的所有元素,其中至少有AB {1}}或A = [ 1.1, 0.0, 3.1, 4.1, 5.1, 0.0, 0.0, 8.1 ] B = [ 0.0, 2.2, 3.2, 4.2, 0.0, 0.0, 7.2, 8.2 ] 非零,或者,两者都不为零。一个例子可能是:

Ap = [ 1.1 0.0 3.1 4.1 5.1 0.0 8.1 ]
Bp = [ 0.0 2.2 3.2 4.2 0.0 7.2 8.1 ]

然后在我要生成的一个函数中:

Ap = [ 3.1 4.1 8.1 ]
Bp = [ 3.2 4.2 8.1 ]

在另一个我想要生成:

(A,B)

现在我正在审视每个元素,但我觉得应该有更好/更快的方式。

更新

我有一个调用[nx,ny,3]的函数,它们是numpytA = np.copy(A) tB = np.copy(B) tA = tA.flatten() tB = tB.flatten() Aeq0 = tA==0 Beq0 = tB==0 Ano0 = A!=0 Bno0 = B!=0 As = tA[ Ano0 | Bno0 ] Bs = tB[ Ano0 | Bno0 ] 个数组。然后我打电话给以下人员:

As = tA[ Ano0 | Bno0 ]

它死于{{1}}

2 个答案:

答案 0 :(得分:1)

你使用蒙面索引来实现这一点。

A = np.asarray(A)
B = np.asarray(B)

ind1 = A!=0
ind2 = B!=0

然后,要实现第一种情况(|是"或"运算符):

case1 = ind1 | ind2 
Ap = A[case1]
Bp = A[case1]

而对于第二种情况(&是"和"运营商):

case2 = ind1 & ind2 
Ap = A[case2]
Bp = A[case2]

答案 1 :(得分:0)

您可以使用array.T创建数组列的二维数组,并在np.logical_or中使用np.where

>>> np.array((A,B)).T[np.where(np.logical_or(A,B))[0]]
array([[ 1.1,  0. ],
       [ 0. ,  2.2],
       [ 3.1,  3.2],
       [ 4.1,  4.2],
       [ 5.1,  0. ],
       [ 0. ,  7.2],
       [ 8.1,  8.2]])

另一种情况是在np.logical_and中使用np.where

>>> np.array((A,B)).T[np.where(np.logical_and(A,B))[0]]
array([[ 3.1,  3.2],
       [ 4.1,  4.2],
       [ 8.1,  8.2]])