В заданном массиве 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)? Спасибо.
Примечание. Это НЕ эквивалентно замене одного элемента на месте другим. Речь идет о замене нескольких значений «единичным» значением. Спасибо.
Нет, я не хочу показаться грубым, но я не знаю другого сокращения для этого выражения, кроме того, этот вопрос является дубликатом, который задавали не менее 3 раз.
@awiebe Нет, об этом не спрашивают ноль раз, не считая этого пока ...
Если вы хотите указать одно значение, вы просто указываете одно значение на правой стороне
@awiebe Не уверен, что это значит ... вопрос заключается в том, чтобы найти простой способ замены двух объектов в массиве одним объектом (также демонстрируется примерами, в которых вы можете четко видеть размер уменьшенного массива на 2 элемента).
Ах, я вижу, вопрос был в изменении размера массива, а не в замене значения. Это имеет больше смысла, чем то, как я это читаю.
@awiebe Ага, вот почему это не дубликат: -) ...
Попробуйте np.put
:
np.put(X, [2,3,7,8], [-1,0]) # `0` can be changed to anything that's 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]
что, если список изначально содержит 0?
Этот ноль на самом деле может быть чем угодно, выходящим за пределы массива ... это ему поможет. Итак, X=numpy.arange(1,11); numpy.put(X, [2,3,7,8], [-1,numpy.max(X)+1]); X[X!=X.max()]
..
Пища для размышлений: что, если мы захотим заменить индексы (2,3,7,8)
на -1
и индексы (9,10)
на -2
..
@khan Затем добавьте дополнительный put
, для индексов 9,10
Это правда. Согласовано.
Я не уверен, можно ли это сделать за один шаг, но вот способ использования 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
. Затем удаляем оставшиеся элементы.
Решение с использованием 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])
Определенно кажется более чистым и эффективным способом.
Это очень хороший подход. Это позволяет избежать лишнего поиска, потому что индексы, которые нужно удалить, уже известны.
@awiebe Я не думаю, что вы уловили суть, дело в том, что два заменяют два индекса одним элементом.