Как удалить ряд элементов с условием в массиве 3 D? - PullRequest
1 голос
/ 23 апреля 2019

У меня есть массив массивов 3 D с 5 данными следующей формы (5,1,1)

a=
arrray([[[0,2,4]],
[[2,6,3]],
[[1,6,9]],
[[4,3,10]]
[[3,3,8]]])

На основе второго элемента массива необходимо настроить массив. Как посчитать частоту элемента в массиве numpy? С этим вычисляется вхождение второго элемента.2 приходит один раз, а 3 повторяется дважды.Здесь я хочу удалить элемент массива, вхождение которого меньше 2. В случае необходимости удаления первой строки [0,2,4].

1 Ответ

1 голос
/ 23 апреля 2019

Это можно сделать с помощью bincount:

In [11]: bins = np.bincount(a[:, 0, 1])

In [22]: a[bins[a[:, 0, 1]] > 1]
Out[22]:
array([[[ 2,  6,  3]],

       [[ 1,  6,  9]],

       [[ 4,  3, 10]],

       [[ 3,  3,  8]]])

Можно также использовать панд для этого:

In [21]: pd.DataFrame(a[:, 0, :]).groupby(1)[0].transform('size')
Out[11]:
0    1
1    2
2    2
3    2
4    2
Name: 0, dtype: int64

In [22]: pd.DataFrame(a[:, 0, :]).groupby(1)[0].transform('size') > 1
Out[22]:
0    False
1     True
2     True
3     True
4     True
Name: 0, dtype: bool

In [23]: a[pd.DataFrame(a[:, 0, :]).groupby(1)[0].transform('size') > 1]
Out[23]:
array([[[ 2,  6,  3]],

       [[ 1,  6,  9]],

       [[ 4,  3, 10]],

       [[ 3,  3,  8]]])

Обратите внимание, если максимальный размер целых очень большой, np.bincount будет неэффективным. Также может быть способ использовать np.unique с return_counts для этого:

In [31]: nums, counts = np.unique(a[:, 0, 1], return_counts=True)

In [32]: a[counts[np.searchsorted(nums, a[:, 0, 1])] > 1]
Out[32]:
array([[[ 2,  6,  3]],

       [[ 1,  6,  9]],

       [[ 4,  3, 10]],

       [[ 3,  3,  8]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...