как фильтровать массивы, хранящиеся в виде двух списков

#python #arrays #list #numpy

#python #массивы #Список #numpy

Вопрос:

У меня есть списки массивов, один из которых — все мои данные, а другой — фильтр:

 data= [array([[12., 2., 7.],
              [9., -1., 0.],
              [2., 0., 4.],
              [14., 2., 1.2]]),
       array([[11., 3., 1.],
              [2., 5., 0.],
              [1., -1., 1.],
              [-8., 0., 6.],
              [2., 3., 3.]])]

filter= [array([2., 0., 5.]),
         array([3., -1.])]
 

Я хочу сохранять только значения каждого моего массива data , чтобы их второй столбец ( data[i][:,1] ) был равен одному значению того же массива из filter (все значения filter[i] ). Я хочу получить следующий результат:

 out = [array([[12., 2., 7.],
              [2., 0., 4.],
              [14., 2., 1.2]]),
       array([[11., 3., 1.],
              [1., -1., 1.],
              [2., 3., 3.]])]
 

Я попробовал следующий код, но он не увенчался успехом:

 out=[]
for a in data:
    for b in filter:
        for c in b:
            if a[:,1]==c:
                bb=a[:,c]
                out=np.append(data,bb)
 

Я заранее признателен за любую помощь и вклад.

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

1. Почему у вас есть вложенные массивы в фильтре?

2. Уважаемый @Dani Mesejo, потому что в некоторых случаях в качестве фильтра могут применяться разные числа. Для каждого массива, хранящегося в моих данных, у меня есть массив в качестве фильтра. В некоторых случаях моим фильтром может быть неровный список, поэтому я решил добавить все массивы (оба filter и data ) в виде списка.

3. Я понимаю, но почему это array([[3., -1.]]) , а не просто array([3., -1.]) ?

4. Извините, это опечатка. Я допустил большую ошибку. array([3., -1.]) правильно.

Ответ №1:

Вы можете использовать np.isin для создания масок, а затем фильтровать с использованием этих масок:

 import numpy as np

data = [np.array([[12., 2., 7.],
                  [9., -1., 0.],
                  [2., 0., 4.],
                  [14., 2., 1.2]]),
        np.array([[11., 3., 1.],
                  [2., 5., 0.],
                  [1., -1., 1.],
                  [-8., 0., 6.],
                  [2., 3., 3.]])]

filter_data = [np.array([2., 0., 5.]),
               np.array([3., -1.])]

# compute the masks
masks = [np.isin(arr[:, 1], filter_arr) for arr, filter_arr in zip(data, filter_data)]

# filter using the masks
result = [arr[mask] for arr, mask in zip(data, masks)]

for filtered_arr in result:
    print(filtered_arr)
 

Вывод

 [[12.   2.   7. ]
 [ 2.   0.   4. ]
 [14.   2.   1.2]]
[[11.  3.  1.]
 [ 1. -1.  1.]
 [ 2.  3.  3.]]