Заменить несколько элементов в массиве NumPy с 1

В данном массиве Numpy X:

X = array([1,2,3,4,5,6,7,8,9,10])

Я хотел бы заменить индексы (2, 3) и (7, 8) одним элементом -1 соответственно, например:

X = array([1,2,-1,5,6,7,-1,10])

Другими словами, я заменил значения в индексах (2, 3) и (7,8) исходного массива на единственное значение.

Вопрос в том, существует ли обходной путь (т.е. без циклов for и использования списков python)? Благодарю.

Примечание. Это НЕ эквивалентно замене одного элемента на месте другим. Речь идет о замене нескольких значений "единственным" значением. Благодарю.

Ответы

Ответ 1

Попробуйте np.put:

np.put(X, [2,3,7,8], [-1,0]) # '0' can be changed to anything that not in the array
print(X[X!=0]) # whatever You put as an number in 'put'

Так что в основном используйте put чтобы сделать значения для индексов, затем отбросьте нулевые значения.

Или, как говорит @khan, может сделать что-то вне диапазона:

np.put(X, [2,3,7,8], [-1,np.max(X)+1])
print(X[X!=X.max()])

Весь вывод:

[ 1  2 -1  5  6  7 -1 10]

Ответ 2

Решение, использующее numpy.delete, похожее на @pault, но более эффективное, так как использует чистую индексацию numpy. Однако из-за этой эффективной индексации это означает, что вы не можете передавать неровные массивы как индексы.

Настроить

a = np.array([1,2,3,4,5,6,7,8,9,10])
idx = np.stack([[2, 3], [7, 8]])

a[idx] = -1
np.delete(a, idx[:, 1:])

array([ 1,  2, -1,  5,  6,  7, -1, 10])

Ответ 3

Я не уверен, что это можно сделать за один шаг, но вот способ с помощью np.delete:

import numpy as np
from operator import itemgetter

X = np.array(range(1,11))
to_replace = [[2,3], [7,8]]


X[list(map(itemgetter(0), to_replace))] = -1
X = np.delete(X, list(map(lambda x: x[1:], to_replace)))
print(X)
#[ 1  2 -1  5  6  7 -1 10]

Сначала мы заменим первый элемент каждой пары на -1. Затем мы удаляем оставшиеся элементы.