Советы по игре в гольф с NumPy, Scipy или Pylab


10

Там уже полный список советов для питона здесь , так что я прошу подсказки , которые конкретно применимы к использованию numpy, scipyили pylabбиблиотеки.

Это могут быть как способы сокращения кода, уже используемого numpy, так и способы сокращения общих операций python с использованием этих библиотек.

Один совет за ответ, пожалуйста.


Обратите внимание, что pylabэто просто matplotlib.pyplot+ numpyв устаревшем общем пространстве имен. Эта numpyчасть pylabтривиальна в том смысле, что в их импорте содержится одинаковое количество байтов, поэтому дополнительно могут быть получены только графические объекты pylab, но я подозреваю, что это не то, что вы имели в виду в своем вопросе.
Андрас Дик

2
@AndrasDeak, я знаю, что использование pylab считается плохой практикой, но очень мало в codegolf можно считать хорошей практикой. Pylab включает в себя части многих numpyпакетов. Например pylab.randint, действует там, где потребуется numpy numpy.random.randint. Поэтому для игры в гольф pylabследует предоставить более короткий код.
user2699

1
Я знаю, что амортизация не является проблемой, моя точка зрения была в том, что она также не дает преимущества. Я просто не осознавал, что подпакеты также загружаются в пространство имен pylab! Извините, вы совершенно правы :)
Андрас Дик

Ответы:


5

Использование Марка из Numpy в вещании

Вещание означает репликацию многомерного массива вдоль некоторых его одноэлементных измерений, чтобы соответствовать размеру другого массива. Это происходит автоматически для массивов Numpy, когда к ним применяются арифметические операторы.

Например, для создания таблицы умножения 10 × 10 вы можете использовать

import numpy
t=numpy.arange(1,11)
print(t*t[:,None]) # Or replace t[:,None] by [*zip(t)]

Попробуйте онлайн!

Здесь tсоздается как массив Numpy [1, 2, ..., 10]. Это имеет форму (10,), которая эквивалентна (1,10). Другой массив операндов t[:,None]имеет размер (10,1). Умножение двух массивов неявно дублирует их, поэтому они ведут себя так, как если бы они оба имели форму (10,10). Результат, который также имеет форму (10,10), содержит произведения для всех пар записей в исходных массивах.


Это было умное использование zipс вещанием, это придет в своем собственном ответе?
user2699

@ user2699 Я не думаю, что стоит отдельного ответа, потому что [*zip(t)]имеет тот же счетчик байтов, что и более читаемый t[:,None]. Но вы правы, это, возможно, стоит отметить, поэтому я добавил это сюда
Луис Мендо,

Хороший вопрос, я полагаю, что я не считал байты. [*zip(t)]было бы на два байта короче, если бы было больше измерений.
user2699

1
Обратите внимание, что расширенная повторяемая распаковка [*zip(t)]будет работать только на Python 3.
Андрас Дик

Я просмотрел эту страницу, так как мне интересно узнать, что же такое numy, чего нет в Perl 6. Во всяком случае, это было бы написано как my \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]или вы могли бы использоватьzip(t)
Брэд Гилберт b2gills

2

Используйте r _ [...] вместо диапазона (...)

Numpy предоставляет синтаксис, подобный matlab, для создания массива r_[...]. Любая запись среза в скобках интерпретируется как массив с указанным диапазоном. Так, например

r_[:30:4]

эквивалентно

arange(0,30,4)

и для большинства применений может заменить

range(0,30 4)

Он также может обрабатывать более сложные выражения. Например, чтобы получить индексы от 0 до 10 и снова отступить,

r_[:10,10:-1:-1]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.