2017-01-04 2 views

ответ

6

Один вкладыш с использованием masking с np.in1d и np.where для присвоения значений -

np.where(np.in1d(range(10),range(2,7)), 1, range(10)) 

Пример прогона -

In [28]: np.where(np.in1d(range(10),range(2,7)), 1, range(10)) 
Out[28]: array([0, 1, 1, 1, 1, 1, 1, 7, 8, 9]) 

Шаг за шагом пробег -

Получить маску, в которой должны быть назначены новые значения:

In [44]: np.in1d(range(10),range(2,7)) 
Out[44]: array([False, False, True, True, True, True, \ 
       True, False, False, False], dtype=bool) 

Используйте маску Alongwith np.where выбирать между новым значением (=1) и первоначально заданных значений - range(10):

In [45]: np.where(np.in1d(range(10),range(2,7)), 1, range(10)) 
Out[45]: array([0, 1, 1, 1, 1, 1, 1, 7, 8, 9]) 

Таким образом, чтобы подвести итог, синтаксис в основном -

np.where(np.in1d(range(10),range(2,7)), 1, range(10)) 
         ^  ^ ^ ^
         (1)  (2) (3) <--(4)--> 

(1) Длина определяемого массива.

(2) Пределы разрезания.

(3) Новое значение (ы), которое должно быть присвоено в качестве второго шага.

(4) Значения, которые были инициализированы массивом во время его определения.

Вот еще использование выборки -

In [41]: np.where(np.in1d(range(9),range(2,7)), 99, range(10,19)) 
Out[41]: array([10, 11, 99, 99, 99, 99, 99, 17, 18]) 

оригинальный стилизованный код, чтобы воспроизвести это было бы -

x = np.arange(10,19) 
x[2:7] = 99 
+3

Хотя это функционально отличный ответ, я думаю, что этот один вкладыш намного менее читабельен, чем исходная двухстрочная версия. Поэтому, если это не так, улучшает производительность (память или скорость), я думаю, что предпочтительнее использовать два линейных подхода. Или, по крайней мере, обязательно прокомментируйте один вкладыш. –

+1

@ HannesOvrén Согласовано по вопросу удобочитаемости. Даже с производительностью/памятью, оригинальная двухстрочная линия будет лучше. Добавлено несколько комментариев/объяснений. – Divakar

0

Вы можете использовать np.hstack:

np.hstack((np.arange(2), np.ones(7-2), np.arange(7,10))) 

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

enter image description here

1

Хотя ответ Divakar в делает работу, это не хорошо для удобства чтения. Существует более многообразный способ сделать это, используя numpy.r_, который по существу выполняет конкатенацию, но вы можете указать массивы с помощью срезов.

Из примеров в документации (слегка видоизмененный мной):

>>> np.r_[1:4, 0, 0, 4:7] 
array([1, 2, 3, 0, 0, 4, 5, 6]) 
>>> np.r_[-1:1:6j, [0]*3, 5, 6] 
array([-1. , -0.6, -0.2, 0.2, 0.6, 1. , 0. , 0. , 0. , 5. , 6. ]) 

Для вашего конкретного примера,

>>> np.r_[0:2, [1,]*5, 7:10] 
array([0, 1, 1, 1, 1, 1, 1, 7, 8, 9]) 
Смежные вопросы