नुकीले, टेढ़े या पाइलैब के साथ गोल्फ के लिए टिप्स


10

वहां पहले से ही अजगर के लिए सुझावों की एक व्यापक सूची है यहाँ , तो क्या मैं के लिए पूछ रहा हूँ सुझावों कि विशेष रूप से उपयोग करने के लिए लागू कर रहे हैं numpy, scipyया pylabपुस्तकालयों।

ये या तो पहले से ही उपयोग करने वाले कोड को छोटा करने के तरीके हो सकते हैं numpy, या इन पुस्तकालयों का उपयोग करके सामान्य अजगर के संचालन को छोटा करने के तरीके।

प्रति उत्तर एक टिप, कृपया।


ध्यान दें कि एक नामांकित सामान्य नामस्थान में pylabबस matplotlib.pyplot+ numpyहै। numpyका हिस्सा pylabसमझ है कि उनके आयात बाइट्स की एक ही नंबर है में तुच्छ, इसलिए केवल साजिश रचने सामान additionaly से आ सकता है है pylab, लेकिन मुझे लगता है कि क्या आप अपने प्रश्न के साथ मन में था नहीं है।
एंड्रास डीक

2
@AndrasDeak, मुझे पता है कि पाइलैब का उपयोग करना बुरा व्यवहार माना जाता है, लेकिन कोडगुल्फ़ में बहुत कम ही अच्छा अभ्यास माना जा सकता है। पायलैब में सीधे कई numpyपैकेजों के हिस्से शामिल हैं। उदाहरण के लिए pylab.randintवैध है जहां सुन्न की आवश्यकता होगी numpy.random.randint। तो गोल्फ के pylabलिए कम कोड प्रदान करना चाहिए।
user2699

1
मुझे पता है कि पदावनति एक समस्या नहीं है, मेरी बात यह थी कि यह भी एक फायदा नहीं देता है। मुझे बस एहसास नहीं हुआ कि उपपैकेज को भी उसी तरह पाइलैब नेमस्पेस में लोड किया गया था! इसलिए क्षमा करें, आप बिलकुल सही हैं :)
आंद्रा डीक

जवाबों:


5

Numpy के प्रसारण का उपयोग करें

ब्रॉडकास्टिंग का अर्थ है, एक एकल सरणी को एक दूसरे सरणी के आकार से मेल खाने के लिए उसके कुछ एकल आयामों के साथ बहुआयामी सरणी की नकल करना। यह स्वचालित रूप से Numpy सरणियों के लिए होता है जब अंकगणित ऑपरेटरों को उन पर लागू किया जाता है।

उदाहरण के लिए, 10 × 10 गुणन तालिका उत्पन्न करने के लिए आप उपयोग कर सकते हैं

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

इसे ऑनलाइन आज़माएं!

यहाँ tNumpy ऐरे के रूप में बनाया गया है [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)]केवल अजगर 3 पर काम करेगा।
एंड्रास डीक

मैंने इस पृष्ठ को देखा क्योंकि मुझे यह पता लगाने में दिलचस्पी है कि पर्ल 6 नहीं है। वैसे भी जो लिखा होगा my \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]या आप उपयोग कर सकते हैंzip(t)
ब्रैड गिल्बर्ट b2gills

2

रेंज के बजाय r _ [...] का उपयोग करें (...)

Numpy सरणी निर्माण के लिए सिंटैक्स की तरह मैटलैब प्रदान करता है r_[...]। कोष्ठक के बीच में किसी भी स्लाइस अंकन को एक श्रेणी के रूप में इंगित किया गया है। इसलिए, उदाहरण के लिए

r_[:30:4]

के बराबर है

arange(0,30,4)

और अधिकांश उपयोगों के लिए प्रतिस्थापित कर सकते हैं

range(0,30 4)

यह अधिक जटिल अभिव्यक्तियों को भी संभाल सकता है। उदाहरण के लिए 0 से 10 तक के सूचकांकों को प्राप्त करने और फिर से वापस करने के लिए,

r_[:10,10:-1:-1]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.