Мне нужно создать массив длины NumPy n
, каждый элемент которого есть v
.
Есть ли что-нибудь лучше, чем:
a = empty(n)
for i in range(n):
a[i] = v
Я знаю zeros
и ones
работал бы для v = 0, 1. Я мог бы использовать v * ones(n)
, но он не будет работать, когда будет намного медленнее.v
есть None
, а также
a = np.zeros(n)
в цикле быстрее, чемa.fill(0)
. Это противоречит тому, что я ожидал, так как думал,a=np.zeros(n)
что нужно будет выделить и инициализировать новую память. Если кто-то может объяснить это, я был бы признателен.v * ones(n)
все еще ужасно, так как использует дорогостоящее умножение. Замените*
на+
while, иv + zeros(n)
в некоторых случаях он оказывается на удивление хорошим ( stackoverflow.com/questions/5891410/… ).var = np.empty(n)
а затем заполнить его с помощью var [:] = v. (кстати,np.full()
так быстро , как это)Ответы:
Представлен NumPy 1.8
np.full()
, который является более прямым методом, чем тот, которыйempty()
используетсяfill()
для создания массива, заполненного определенным значением:Это, возможно , способ создания массива , заполненный определенными значениями, потому что он явно описывает то , что это достигается (и это в принципе может быть очень эффективным , так как он выполняет очень конкретную задачу).
источник
help(numpy.full)
в оболочке Python. Я также удивлен, что этого нет в веб-документации.np.fill()
не существует и должно бытьarr.fill()
), с разницей около 10%. Если бы разница была больше, я бы поднял проблему в трекере ошибок NumPy. :) Я предпочитаю более четкий и понятный код, потому что такая небольшая разница во времени выполнения, поэтому яnp.full()
все время продолжаю.Обновлен для Numpy 1.7.0: (Подсказка к @Rolf Bartstra.)
a=np.empty(n); a.fill(5)
самый быстрыйВ порядке убывания скорости:
источник
np.full()
было бы полезно. На моей машине, с NumPy 1.8.1, она примерно на 15% медленнее, чем менее прямаяfill()
версия (что неожиданно, посколькуfull()
потенциально может стать немного быстрее).fill()
это самое быстрое решение. Решение для умножения намного медленнее.10000
вместо1e4
значительного изменения по какой-то причине (full()
почти на 50% медленнее1e4
).full()
, он работает значительно медленнее, когда тип данных явно не является плавающим. В противном случае, это сопоставимо (но немного медленнее) с лучшими методами здесь.full(100000, 5)
,full(100000, 5, dtype=float)
,full(100000, 5, dtype=int)
иa =np.empty(100000); a.fill(5)
все берут примерно в то же время на моей машине (без кэширования:%timeit -r1 -n1 …
) (NumPy 1.11.2).Я считаю, что
fill
это самый быстрый способ сделать это.Вы также должны всегда избегать итераций, как вы делаете в своем примере. Простое
a[:] = v
выполнит то, что делает ваша итерация, используя пустое вещание .источник
fill
, я увидел, что этоrepeat
удовлетворяет мои потребности еще лучше.a[:]=v
самом деле быстрее, чемfill
?fill
.Очевидно, что не только абсолютные скорости, но и порядок скорости (как сообщается пользователем 1579844) зависят от машины; вот что я нашел:
a=np.empty(1e4); a.fill(5)
самый быстрый;В порядке убывания скорости:
Итак, попытайтесь выяснить и использовать то, что быстрее всего на вашей платформе.
источник
я имел
в виду, но, видимо, это медленнее, чем все другие предложения для достаточно большой
n
.Вот полное сравнение с перфплотом ( мой любимый проект).
Две
empty
альтернативы по-прежнему самые быстрые (с NumPy 1.12.1).full
догоняет для больших массивов.Код для генерации сюжета:
источник
Вы можете использовать
numpy.tile
, например:Хотя
tile
он предназначен для «разбиения» массива (вместо скаляра, как в данном случае), он будет выполнять свою работу, создавая предварительно заполненные массивы любого размера и размера.источник
без обалденного
источник
[v] * n
будет иметь более непосредственное отношение к вопросу ОП.