Заменить несколько элементов в массиве 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)? Спасибо.

Примечание. Это НЕ эквивалентно замене одного элемента на месте другим. Речь идет о замене нескольких значений «единичным» значением. Спасибо.

@awiebe Я не думаю, что вы уловили суть, дело в том, что два заменяют два индекса одним элементом.

U12-Forward 26.10.2018 04:23

Нет, я не хочу показаться грубым, но я не знаю другого сокращения для этого выражения, кроме того, этот вопрос является дубликатом, который задавали не менее 3 раз.

awiebe 26.10.2018 04:23

@awiebe Нет, об этом не спрашивают ноль раз, не считая этого пока ...

U12-Forward 26.10.2018 04:23

Если вы хотите указать одно значение, вы просто указываете одно значение на правой стороне

awiebe 26.10.2018 04:32

@awiebe Не уверен, что это значит ... вопрос заключается в том, чтобы найти простой способ замены двух объектов в массиве одним объектом (также демонстрируется примерами, в которых вы можете четко видеть размер уменьшенного массива на 2 элемента).

khan 26.10.2018 04:40

Ах, я вижу, вопрос был в изменении размера массива, а не в замене значения. Это имеет больше смысла, чем то, как я это читаю.

awiebe 26.10.2018 04:45

@awiebe Ага, вот почему это не дубликат: -) ...

U12-Forward 26.10.2018 04:46
15
7
4 357
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Попробуйте 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?

Ashutosh Chapagain 26.10.2018 04:42

Этот ноль на самом деле может быть чем угодно, выходящим за пределы массива ... это ему поможет. Итак, X=numpy.arange(1,11); numpy.put(X, [2,3,7,8], [-1,numpy.max(X)+1]); X[X!=X.max()] ..

khan 26.10.2018 04:50

Пища для размышлений: что, если мы захотим заменить индексы (2,3,7,8) на -1 и индексы (9,10) на -2 ..

khan 26.10.2018 04:54

@khan Затем добавьте дополнительный put, для индексов 9,10

U12-Forward 26.10.2018 04:57

Это правда. Согласовано.

khan 26.10.2018 04:58

Я не уверен, можно ли это сделать за один шаг, но вот способ использования 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])

Определенно кажется более чистым и эффективным способом.

BernardL 26.10.2018 05:15

Это очень хороший подход. Это позволяет избежать лишнего поиска, потому что индексы, которые нужно удалить, уже известны.

khan 27.10.2018 00:38

Другие вопросы по теме