用于nd数组的python中的逻辑索引

时间:2016-04-25 11:40:09

标签: python arrays numpy

我试图从(N x N x N) numpy数组中提取所有索引,其中A和B数组中的值都等于某个值x - 找到常见的重叠。

我在尝试:

   A[A==1 and B==1]

但是收到错误:

  

ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

Numpy不能重载“和”关键字。然而,它重载二进制AND运算符&为了这。尝试:

A [(A == 1)& (B == 1)]

parantheses很重要。我发现它经常(并不总是)比logical_and

更易读

答案 1 :(得分:1)

考虑以下三维数组,这些数组随机填充值-1,0和1:

import numpy as np
np.random.seed(2016)  # use a fixed seed to get the same results on multiple runs
N = 3
A = np.random.randint(-1, 2, N**3).reshape([N, N, N])
B = np.random.randint(-1, 2, N**3).reshape([N, N, N])

请注意,您需要使用固定种子(例如2016)才能在多次运行中获得相同的结果:

>>> print A
[[[ 1  1  0]
  [-1  1 -1]
  [-1 -1 -1]]

 [[ 0  1  1]
  [-1  1  1]
  [ 0  1  0]]

 [[ 0  1  0]
  [-1  1  1]
  [-1  1  0]]]

>>> print B
[[[-1  0  0]
  [-1 -1  1]
  [ 0 -1 -1]]

 [[-1 -1 -1]
  [-1  1  1]
  [-1  1  1]]

 [[ 1  1 -1]
  [-1  0  1]
  [-1  1 -1]]]

如果您的目标是提取两个矩阵中<1>的元素的索引,您可能会发现此代码非常有用:

>>> np.transpose(np.where((A==1)*(B==1)))
array([[1, 1, 1],
       [1, 1, 2],
       [1, 2, 1],
       [2, 0, 1],
       [2, 1, 2],
       [2, 2, 1]], dtype=int64)

答案 2 :(得分:0)

或许稍微仓促地发布这个问题。使用了numpy的

logical_and(x1, x2[, out])

最终完成了这项工作!