Фильтрация numpy массива кортежей приводит к ошибке ValueError

#python #arrays #numpy #tuples

#python #массивы #numpy #кортежи

Вопрос:

У меня есть numpy массив кортежей и я хочу их отфильтровать, но, похоже, ничего не работает

  possible_points = np.random.normal((0,0),0.01,size=(100,2))
 possible_points = possible_points[possible_points > (0,0) and possible_points < (1,1)]
  

Это приводит к ошибке

 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
  

Я подозреваю, что проблема каким-то образом связана со следующим. Когда я делаю, например,

 possible_points = [possible_points > (0,0)]
  

possible_points становится чем-то вроде

 [array([[False, False],
       [ True, False],
       [ True, False],
       [ True,  True],
       [ True,  True],
       [ True,  True],
       [ True,  True],
       [False, False],
       [ True, False],
    ...
  

Насколько я понимаю, он должен возвращать True, если possible_points> (0,0) и False в противном случае, но он оценивает координату каждого кортежа индивидуально. Есть даже некоторые точки, которые становятся [True, False] . Если я сделаю

 possible_points = possible_points[possible_points > (0,0)]
  

Я перестаю иметь кортежи и имею что-то вроде

 array([3.36687201e-03, 7.97227921e-04, 3.44875252e-03, 8.79364101e-03,....])
  

И я подозреваю, что это то, что дает ValueErros .

Кто-нибудь может помочь мне понять, что я делаю неправильно, и помочь мне достичь моей цели?

Комментарии:

1. Каков ваш ожидаемый результат?

2. @Michaelsczesny, я хочу иметь элементы возможных точек, которые больше (0,0) и меньше (1,1)

Ответ №1:

IIUC, вы должны использовать amp; оператор вместе со всеми столбцами (axis= 1), например:

 import numpy as np

# set a seed for reproducibility
np.random.seed(42)

possible_points = np.random.normal((0, 0), 0.01, size=(100, 2))

# create the filtering mask
mask = ((possible_points > (0, 0)) amp; (possible_points < (1, 1))).all(axis=1)

# filter
possible_points = possible_points[mask]

print(possible_points)
  

Вывод

 [[0.00647689 0.0152303 ]
 [0.01579213 0.00767435]
 [0.00738467 0.00171368]
 [0.01031    0.0093128 ]
 [0.00331263 0.00975545]
 [0.00812526 0.0135624 ]
 [0.00361396 0.01538037]
 [0.00915402 0.00328751]
 [0.00097078 0.00968645]
 [0.0029612  0.00261055]
 [0.01886186 0.00174578]
 [0.0006023  0.02463242]
 [0.01142823 0.00751933]
 [0.00586857 0.02190456]
 [0.0022746  0.01307143]
 [0.00259883 0.00781823]
 [0.00521942 0.00296985]
 [0.00250493 0.00346448]
 [0.01865775 0.00473833]
 [0.00963376 0.00412781]
 [0.0082206  0.01896793]
 [0.00276691 0.00827183]
 [0.00013002 0.01453534]
 [0.00173181 0.00385317]]
  

Комментарии:

1. Да, это помогает, спасибо! Я приму ответ, когда смогу. Я также попытаюсь выяснить, почему это имеет смысл.