Давайте возьмем подход с целым массивом
In [140]: arr = np.array([[1,2],[2,3],[10,1],[10,10]])
In [141]: arr
Out[141]:
array([[ 1, 2],
[ 2, 3],
[10, 1],
[10, 10]])
Мы хотим скопировать строки, где во 2-м столбце есть 1 или 2, верно?isin
создает хорошую «маску» (мы также можем использовать ==
и any
):
In [142]: np.isin(arr[:,1],[1,2])
Out[142]: array([ True, False, True, False])
In [143]: torepeat = arr[np.isin(arr[:,1],[1,2])]
In [144]: torepeat
Out[144]:
array([[ 1, 2],
[10, 1]])
np.repeat
делает хорошую работу по репликации значений, которые мы можем просто объединить соригинал:
In [145]: repeated = np.repeat(torepeat,5, axis=0)
In [146]: np.concatenate((arr, repeated),axis=0)
Out[146]:
array([[ 1, 2],
[ 2, 3],
[10, 1],
[10, 10],
[ 1, 2],
[ 1, 2],
[ 1, 2],
[ 1, 2],
[ 1, 2],
[10, 1],
[10, 1],
[10, 1],
[10, 1],
[10, 1]])
np.append
использует concatenate
.Он работает нормально с добавлением одного элемента в массив 1d, но становится сложнее использовать его с большими размерами.Это плохая имитация списка приложений.Также повторное объединение в цикле является относительно медленным.Обычно мы рекомендуем добавлять список с окончанием построения одного массива.
Другой способ итеративного использования repeat
:
In [164]: np.concatenate([np.repeat(a[None,:], 5, axis=0) for a in arr if (a[1]==1 or a[1]==2)], axis=0)
Out[164]:
array([[ 1, 2],
[ 1, 2],
[ 1, 2],
[ 1, 2],
[ 1, 2],
[10, 1],
[10, 1],
[10, 1],
[10, 1],
[10, 1]])