У меня есть массив из четырех строк A = array([[-1, -1, -1, -1], [-1, -1, 1, 2], [-1, -1, 1, 1], [2, 1, -1, 2]]). В каждой строке есть 4 номеров. Как мне удалить row#3 и row#4? В row#3 и row#4 1 и 2 появляются более одного раза соответственно.

Есть ли более быстрый способ сделать это для произвольного числа строк и столбцов? Основная цель - удалить те строки, где неотрицательные числа появляются более одного раза.

1
Lalu 20 Дек 2019 в 18:16

2 ответа

Мой полностью векторизованный подход:

  • сортировать каждую строку
  • обнаружение дубликатов путем смещения отсортированного массива влево на единицу и сравнения с самим собой
  • помечать строки положительными дубликатами
  • падение
import numpy as np
a = np.array([[-1, -1, -1, -1], [-1, -1, 1, 2], [-1, -1, 1, 1], [2, 1, -1, 2]])

# sort each row
b = np.sort(a)

# mark positive duplicates
drop = np.any((b[:,1:]>0) & (b[:,1:] == b[:,:-1]), axis=1)

# drop
aa = a[~drop, :]

Output:
array([[-1, -1, -1, -1],
       [-1, -1,  1,  2]])

2
9mat 20 Дек 2019 в 15:53

Вы можете использовать что-то вроде этого: сначала создайте словарь вхождений каждого значения во вложенных массивах, используя np.unique, и сохраняйте массивы только в тех случаях, когда положительное число не появляется более одного раза.

A = np.array([[-1, -1, -1, -1], [-1, -1, 1, 2], [-1, -1, 1, 1], [2, 1, -1, 2]])

new_array = []

# loop through each array
for array in A:
    # Get a dictionary of the counts of each value
    unique, counts = np.unique(array, return_counts=True)
    counts = dict(zip(unique, counts))
    # Find the number of occurences of postive numbers
    positive_occurences = [value for key, value in counts.items() if key > 0]
    # Append to new_array if no positive number appears more than once
    if any(y > 1 for y in positive_occurences):
        continue
    else:
        new_array.append(array)

new_array = np.array(new_array)

Это возвращает:

array([[-1, -1, -1, -1],
       [-1, -1,  1,  2]])
2
Sam Maule 20 Дек 2019 в 15:40