我有两个numpy
数组A
和B
。我想创建数组Ap
和Bp
,以便Ap
和Bp
都是A
和B
的所有元素,其中至少有A
和B
{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]
的函数,它们是numpy
个tA = 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}}
答案 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]])