2014-04-29 48 views
12

मैं यादृच्छिक मानों की numpy सरणी बना रहा हूं और उन्हें 32-बिट फ्लोट वाले मौजूदा सरणी में जोड़ रहा हूं। मैं लक्ष्य सरणी के रूप में एक ही प्रकार का उपयोग करके यादृच्छिक मान उत्पन्न करना चाहता हूं, ताकि मुझे मैन्युअल रूप से dtypes को परिवर्तित करने की आवश्यकता न हो। वर्तमान में मैं ऐसा करते हैं:यादृच्छिक मूल्य उत्पन्न करते समय मैं एक numpy dtype निर्दिष्ट कर सकते हैं?

x += np.random.randn(*x.shape, dtype=x.dtype) 

लेकिन randn (और वास्तव में numpy.random विधियों में से कोई नहीं) एक को स्वीकार नहीं करता:

import numpy as np 

x = np.zeros((10, 10), dtype='f') 
x += np.random.randn(*x.shape).astype('f') 

मैं अंतिम पंक्ति के बजाय क्या करना चाहते हैं क्या की तरह कुछ है dtype तर्क।

मेरा विशिष्ट प्रश्न यह है कि, जब मैं उन्हें बना देता हूं तो यादृच्छिक संख्याओं के लिए एक प्रकार टाइप करना संभव है, astype पर कॉल किए बिना? (मेरा अनुमान है कि यादृच्छिक संख्या जनरेटर 64 बिट लंबा है, इसलिए यह वास्तव में ऐसा करने में कोई समझ नहीं आता है, लेकिन मैंने सोचा कि मैं पूछूंगा कि यह संभव है या नहीं।)

+2

numpy स्वचालित रूप से आपके यादृच्छिक सरणी के प्रकार को 'x' के प्रकार में परिवर्तित कर देगा जब आप ऑपरेशन करते हैं, वहां' अस्थिर 'की बिल्कुल आवश्यकता नहीं होती है, बस' x + = np.random.randn करें (* x.shape) ', और अपने आप को देखें कि' x.dtype' नहीं बदलता है। – Jaime

उत्तर

14

प्रश्न: क्या यह संभव है जब मैं उन्हें बनाते हैं तो यादृच्छिक संख्याओं के लिए एक प्रकार निर्दिष्ट करें।

ए: नहीं, यह नहीं है। randn आकार स्वीकार करता है केवल randn (D0, डी 1, ..., dn) के रूप में

बस इस प्रयास करें:

x = np.random.randn(10, 10).astype('f') 

या की तरह

np.random.randn2 = lambda *args, **kwarg: np.random.randn(*args).astype(kwarg.get('dtype', np.float64)) 
x = np.random.randn2(10, 10, dtype='f') 

एक नया कार्य को परिभाषित आप तो पोस्ट पर अपने कोड का उपयोग करना होगा, इसके बजाय

x = np.zeros((10, 10), dtype='f') 
x[:] = np.random.randn(*x.shape) 

यह असाइन करें randn के परिणाम np.zeros

+0

यह स्केलर्स (उदाहरण के लिए रैंडन()) के मामले में काम नहीं करता है क्योंकि रैंडन एक फ्लोट संख्यात्मक प्रकार लौटाएगा, एक सरणी नहीं - अन्यथा, मूल रूप से मैंने जो भी किया है –

+0

यह प्रैक्टपे ('i) के लिए काम नहीं करता है। ') क्योंकि यह 0 के रूप में सभी तत्वों के साथ एक मैट्रिक्स देता है। – 2324

2

मुझे यह कहकर शुरू करें कि numpy अब यादृच्छिक पूर्णांक के लिए dtypes का समर्थन करता है। इस वृद्धि को numpy के github पर Issue #6790 के माध्यम से ट्रैक किया जा सकता है। लेकिन आज के रूप में, यह सुविधा gaussian RNG के लिए उपलब्ध नहीं है। तो मैं numpy के लिए इस पैच, ने लिखा है कि मैं इस एक ही सुविधा की जरूरत https://gist.github.com/se4u/e44f631b249e0be03c21c6c898059176

पैच केवल float मूल्यों को पैदा करने के लिए समर्थन जोड़ता है और यह अन्य डेटा प्रकार संभाल नहीं करता है, लेकिन यह अभी भी किसी के लिए उपयोगी हो सकता है।

संबंधित मुद्दे