Удалить пустые строки, содержащиеся в списке? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть массив и список.Я хочу удалить строки, содержащиеся в списке.

a = np.zeros((3, 2))
a[0, :] = [1, 2]
l = [(1, 2), (3, 4)]

В настоящее время я пытаюсь сделать это путем создания набора строк a, а затем исключить set, созданный из l,что-то вроде:

sa = set(map(tuple, a))
sl = set(l)
np.array(list(sa - sl))

или более просто

sl = set(l)
np.array([row for row in list(map(tuple, a)) if row not in sl]

Они работают очень хорошо, когда каждая строка короткая.

Есть ли более быстрый путь?Мне нужно оптимизировать скорость.

1 Ответ

0 голосов
/ 04 октября 2018

Подход № 1: Вот один с views (просмотр каждой строки как элемента с расширенным dtype) -

# https://stackoverflow.com/a/45313353/ @Divakar
def view1D(a, b): # a, b are arrays
    a = np.ascontiguousarray(a)
    b = np.ascontiguousarray(b)
    void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
    return a.view(void_dt).ravel(),  b.view(void_dt).ravel()

a1D,l1D = view1D(a,l)
out = a[np.in1d(a1D,l1D,invert=True)]

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

np.unique(out,axis=0)

Примеры выходных данных -

In [72]: a
Out[72]: 
array([[1, 2],
       [0, 0],
       [0, 0]])

In [73]: l
Out[73]: [(1, 2), (3, 4)]

In [74]: out
Out[74]: 
array([[0, 0],
       [0, 0]])
In [75]: np.unique(out,axis=0)
Out[75]: array([[0, 0]])

Подход № 2: Ста же философия уменьшения размерности, здесь с умножением матрицы, специфичным для int данных dtype -

l = np.asarray(l)
shp = np.maximum(a.max(0)+1,l.max(0)+1)
s = np.r_[shp[::-1].cumprod()[::-1][1:],1]
l1D = l.dot(s)
a1D = a.dot(s)
l1Ds = np.sort(l1D)
out = a[l1D[np.searchsorted(l1Ds,a1D)] != a1D]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...