Поради щодо гри в гольф з нумію, схипі або пілабу


10

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

Це можуть бути або способи скорочення коду, які вже використовуються numpy, або способи скорочення поширених операцій python за допомогою цих бібліотек.

Будь ласка, одна порада на відповідь.


Зауважте, що pylabце просто matplotlib.pyplot+ numpyу застарілому загальному просторі імен. numpyЧастина pylabтривіально в тому сенсі , що їх імпорт мають однакову кількість байтів, тому тільки креслення матеріал може додатково надходити з pylab, але я підозрюю , що це не те , що ви мали на увазі , з вашим питанням.
Андрас Дек

2
@AndrasDeak, я знаю, що використання pylab вважається поганою практикою, але дуже мало в кодегольфі можна вважати хорошою практикою. Pylab безпосередньо включає частини багатьох numpyпакетів. Наприклад pylab.randint, дійсний там, де нумеру знадобиться numpy.random.randint. Тож для гольфу pylabслід передбачити коротший код.
користувач2699

1
Я усвідомлюю, що депресія - це не проблема, я зазначив, що це також не дає переваги. Я просто не усвідомлював, що підпакети також завантажуються в подібний простір імен! Так вибачте, ви абсолютно праві :)
Андрас Дік

Відповіді:


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з мовленням, чи це вийде у власній відповіді?
користувач2699

@ user2699 Я не думаю, що варто окремої відповіді, тому що [*zip(t)]має такий самий підрахунок байтів, як і більш читабельний t[:,None]. Але ви маєте рацію, це, можливо, варто зазначити, тому я додав його сюди
Луїс Мендо,

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

1
Зауважте, що розширене ітерабельне розпакування [*zip(t)]буде працювати лише на python 3.
Deras Deak

Я переглянув цю сторінку, оскільки мені цікаво дізнатись, що таке нуме, що 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.