Заменить несколько элементов в массиве 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
. Затем мы удаляем оставшиеся элементы.