2009-11-01 5 views
9

मैं उस प्रकार के वैध मानों की पूरी श्रृंखला के भीतर Numpy, का उपयोग करके पूर्णांक और फ़्लोट्स के लिए यादृच्छिक 64-बिट पूर्णांक मान उत्पन्न करने का प्रयास कर रहा हूं। यादृच्छिक 32-बिट तैरता उत्पन्न करने के लिए, मैं उपयोग कर सकते हैं:यादृच्छिक int64 और float64 संख्या

In [2]: np.random.uniform(low=np.finfo(np.float32).min,high=np.finfo(np.float32).max,size=10) 
Out[2]: 
array([ 1.47351436e+37, 9.93620693e+37, 2.22893053e+38, 
     -3.33828977e+38, 1.08247781e+37, -8.37481260e+37, 
     2.64176554e+38, -2.72207226e+37, 2.54790459e+38, 
     -2.47883866e+38]) 

लेकिन अगर मैं कोशिश करते हैं और 64-बिट संख्या के लिए इस का उपयोग, मैं

In [3]: np.random.uniform(low=np.finfo(np.float64).min,high=np.finfo(np.float64).max,size=10) 
Out[3]: array([ Inf, Inf, Inf, Inf, Inf, Inf, Inf, Inf, Inf, Inf]) 

इसी तरह मिलता है, पूर्णांकों के लिए, मैं सफलतापूर्वक उत्पन्न कर सकते हैं यादृच्छिक 32-बिट पूर्णांकों:

In [4]: np.random.random_integers(np.iinfo(np.int32).min,high=np.iinfo(np.int32).max,size=10) 
Out[4]: 
array([-1506183689, 662982379, -1616890435, -1519456789, 1489753527, 
     -604311122, 2034533014, 449680073, -444302414, -1924170329]) 

लेकिन 64-बिट पूर्णांकों के लिए असफल हूँ:

In [5]: np.random.random_integers(np.iinfo(np.int64).min,high=np.iinfo(np.int64).max,size=10) 
--------------------------------------------------------------------------- 
OverflowError        Traceback (most recent call last) 

/Users/tom/tmp/<ipython console> in <module>() 

/Library/Python/2.6/site-packages/numpy/random/mtrand.so in mtrand.RandomState.random_integers (numpy/random/mtrand/mtrand.c:6640)() 

/Library/Python/2.6/site-packages/numpy/random/mtrand.so in mtrand.RandomState.randint (numpy/random/mtrand/mtrand.c:5813)() 

OverflowError: long int too large to convert to int 

क्या यह अपेक्षित व्यवहार है, या क्या मुझे इन्हें नम्पी में बग के रूप में रिपोर्ट करना चाहिए?

+1

आप हल करने के लिए है कि अंत में सक्षम थे? – Avision

उत्तर

0

ऐसा लगता है कि random_numbers विधि केवल 32-बिट पूर्णांक की अपेक्षा करता है।

ticket #555 के अनुसार यादृच्छिक बीज अब संस्करण 1.1.0 के रूप में 64-बिट हो सकते हैं। मैं सुझाव देता हूं कि here से न्यूमपी के नवीनतम संस्करण को डाउनलोड और इंस्टॉल करें।

+0

मैं numpy के नवीनतम svn संस्करण का उपयोग कर रहा हूं पहले से ही – astrofrog

+0

यह कौन सा संस्करण कहता है? – Soviut

+0

एनपी .__ संस्करण__ 1.4.0.dev7539 – astrofrog

7

पूर्णांकों के लिए आप 2 32 बिट यादृच्छिक संख्या पैदा करते हैं और उन्हें जोड़ सकता:

a + (b << 32) 
+0

जेनरेटर को बायियाइज्ड किया जा सकता है। चक्रीय जनरेटर के साथ, एक => बी। –

+0

@ बीएम। आप देखते हैं कि यह पक्षपाती क्यों हो सकता है? पूर्वाग्रह को दूर करने का कोई तरीका है? – Avision

2

ऐसा लगता है कि numpy.random.uniform() के लिए कोड कुछ बिंदु पर हाई-लो गणना करता है, और Inf वहाँ से उपजी है।

समान रूप से वितरित पूर्णांक दिखाए गए अनुसार उत्पन्न करना आसान है। समान रूप से वितरित फ्लोटिंग पॉइंट नंबरों को बल्कि अधिक सावधानीपूर्वक विचार की आवश्यकता होगी।

इन विषमताओं को बग के रूप में रिपोर्ट करने के लिए, मुझे लगता है कि आपको या तो परियोजना मेलिंग सूची में संदेश भेजना चाहिए या पोस्ट करना चाहिए। इस तरह आप कम से कम पता लगाएंगे कि डेवलपर्स क्या सोचते हैं उचित व्यवहार है।

0

मुझे विश्वास नहीं है कि यह यादृच्छिक बीज कॉल को संदर्भित करता है। सरल कोड मुझे मिल गया है कि में "अजगर पूर्णांक भी सी लंबे कन्वर्ट करने के लिए बड़े" होता है:

x = numpy.random.random_integers(2**64,size=(SIZE,)).astype(numpy.uint64) 

numpy। संस्करण = 1.5.0 यहाँ

0

मुझे पता है यह एक बहुत पुरानी सवाल है, लेकिन अजगर 3.6.3 में एक नया जवाब है:

Python 3.6.3 |Anaconda, Inc.| (default, Oct 6 2017, 12:04:38) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import numpy as np 
>>> import sys 
>>> sys.maxsize 
9223372036854775807 
>>> np.random.randint(sys.maxsize) 
8550528944245072046