Есть ли способ сделать следующийОпределить Numpy массив и присвоить значения в одной строке
import numpy as np
x = np.arange(10)
x[2:7] = 1
В одной строке? Что-то вроде
x = np.arange(10)[2:7] = 1
Есть ли способ сделать следующийОпределить Numpy массив и присвоить значения в одной строке
import numpy as np
x = np.arange(10)
x[2:7] = 1
В одной строке? Что-то вроде
x = np.arange(10)[2:7] = 1
Один вкладыш с использованием 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
Хотя это функционально отличный ответ, я думаю, что этот один вкладыш намного менее читабельен, чем исходная двухстрочная версия. Поэтому, если это не так, улучшает производительность (память или скорость), я думаю, что предпочтительнее использовать два линейных подхода. Или, по крайней мере, обязательно прокомментируйте один вкладыш. –
@ HannesOvrén Согласовано по вопросу удобочитаемости. Даже с производительностью/памятью, оригинальная двухстрочная линия будет лучше. Добавлено несколько комментариев/объяснений. – Divakar
Вы можете использовать np.hstack:
np.hstack((np.arange(2), np.ones(7-2), np.arange(7,10)))
и умножать np.ones
с какой номер, который вам нужен. Должно быть просто, чтобы расширить его до произвольных номеров ввода.
Хотя ответ 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])
@Minato Нет, это просто пример, я ищу общее решение –