2013-05-20 5 views
7

numpy सरणियों की एक विनिर्देश, निर्दिष्ट करने matplotlib डेटा की साजिश रचने के लिए विशिष्ट विचार करें:दो सरणी बिना, अंधाकार के बिना, numpy में?

t = np.arange(0.0,1.5,0.25) 
s = np.sin(2*np.pi*t) 

असल में, इस सरणी t में हमारे (x,y) डेटा बिंदुओं के x निर्देशांक संग्रहीत करता है; और परिणामी y समन्वय (y = f (x) का परिणाम, इस मामले में sin(x)) सरणी s में।

for x, y in np.nditer([t,s]): 
    print("xy: %f:%f" % (x,y)) 

तो, मैं निम्नलिखित स्निपेट कोशिश कर रहा हूँ: तो फिर, यह numpy.nditer समारोह का उपयोग करने के t और s में प्रविष्टियों की क्रमागत जोड़ी प्राप्त करने के लिए के रूप में प्रतिनिधित्व करने (x,y) एक डेटा बिंदु के समन्वय, बहुत सुविधाजनक है test.py के रूप में:

import numpy as np 
print("numpy version {0}".format(np.__version__)) 
t = np.arange(0.0,1.5,0.25) ; print("t", ["%+.2e"%i for i in t]) 
s = np.sin(2*np.pi*t)   ; print("s", ["%+.2e"%i for i in s]) 
print("i", ["% 9d"%i for i in range(0, len(t))]) 
for x, y in np.nditer([t,s]): 
    print("xy: %f:%f" % (x,y)) 

... और परिणाम हैं:

$ python3.2 test.py 
numpy version 1.7.0 
t ['+0.00e+00', '+2.50e-01', '+5.00e-01', '+7.50e-01', '+1.00e+00', '+1.25e+00'] 
s ['+0.00e+00', '+1.00e+00', '+1.22e-16', '-1.00e+00', '-2.45e-16', '+1.00e+00'] 
i ['  0', '  1', '  2', '  3', '  4', '  5'] 
xy: 0.000000:0.000000 
xy: 0.250000:1.000000 
xy: 0.500000:0.000000 
xy: 0.750000:-1.000000 
xy: 1.000000:-0.000000 
xy: 1.250000:1.000000 

$ python2.7 test.py 
numpy version 1.5.1 
('t', ['+0.00e+00', '+2.50e-01', '+5.00e-01', '+7.50e-01', '+1.00e+00', '+1.25e+00']) 
('s', ['+0.00e+00', '+1.00e+00', '+1.22e-16', '-1.00e+00', '-2.45e-16', '+1.00e+00']) 
('i', ['  0', '  1', '  2', '  3', '  4', '  5']) 
Traceback (most recent call last): 
    File "test.py", line 10, in <module> 
    for x, y in np.nditer([t,s]): 
AttributeError: 'module' object has no attribute 'nditer' 

आह - यह पता चला है कि the iterator object nditer, introduced in NumPy 1.6, मेरे पायथन 2.7 स्थापना के numpy संस्करण में उपलब्ध नहीं है।

तो, के रूप में मैं भी उस विशेष संस्करण का समर्थन करना चाहते हैं, मैं बड़ा numpy के लिए काम एक तरह से खोजने की जरूरत चाहते हैं - लेकिन मैं था अभी भी सिर्फ for x,y in somearray को निर्दिष्ट, और निर्देशांक में सीधे प्राप्त करने की सुविधा की तरह सूचित करते रहना।

कुछ numpy प्रलेखन के साथ के बारे में खिलवाड़ के बाद, मैं इस getXyIter समारोह के साथ आया था:

import numpy as np 
print("numpy version {0}".format(np.__version__)) 
t = np.arange(0.0,1.5,0.25) ; print("t", ["%+.2e"%i for i in t]) 
s = np.sin(2*np.pi*t)   ; print("s", ["%+.2e"%i for i in s]) 
print("i", ["% 9d"%i for i in range(0, len(t))]) 

def getXyIter(inarr): 
    if np.__version__ >= "1.6.0": 
    return np.nditer(inarr.tolist()) 
    else: 
    dimensions = inarr.shape 
    xlen = dimensions[1] 
    xinds = np.arange(0, xlen, 1) 
    return np.transpose(np.take(inarr, xinds, axis=1)) 

for x, y in getXyIter(np.array([t,s])): 
    print("xyIt: %f:%f" % (x,y)) 

for x, y in np.nditer([t,s]): 
    print("xynd: %f:%f" % (x,y)) 

... जो ठीक

$ python2.7 test.py 
numpy version 1.5.1 
('t', ['+0.00e+00', '+2.50e-01', '+5.00e-01', '+7.50e-01', '+1.00e+00', '+1.25e+00']) 
('s', ['+0.00e+00', '+1.00e+00', '+1.22e-16', '-1.00e+00', '-2.45e-16', '+1.00e+00']) 
('i', ['  0', '  1', '  2', '  3', '  4', '  5']) 
xyIt: 0.000000:0.000000 
xyIt: 0.250000:1.000000 
xyIt: 0.500000:0.000000 
xyIt: 0.750000:-1.000000 
xyIt: 1.000000:-0.000000 
xyIt: 1.250000:1.000000 
Traceback (most recent call last): 
    File "test.py", line 23, in <module> 
    for x, y in np.nditer([t,s]): 
AttributeError: 'module' object has no attribute 'nditer' 
$ python3.2 test.py 
numpy version 1.7.0 
t ['+0.00e+00', '+2.50e-01', '+5.00e-01', '+7.50e-01', '+1.00e+00', '+1.25e+00'] 
s ['+0.00e+00', '+1.00e+00', '+1.22e-16', '-1.00e+00', '-2.45e-16', '+1.00e+00'] 
i ['  0', '  1', '  2', '  3', '  4', '  5'] 
xyIt: 0.000000:0.000000 
xyIt: 0.250000:1.000000 
xyIt: 0.500000:0.000000 
xyIt: 0.750000:-1.000000 
xyIt: 1.000000:-0.000000 
xyIt: 1.250000:1.000000 
xynd: 0.000000:0.000000 
xynd: 0.250000:1.000000 
xynd: 0.500000:0.000000 
xynd: 0.750000:-1.000000 
xynd: 1.000000:-0.000000 
xynd: 1.250000:1.000000 

मेरा प्रश्न है काम करने के लिए लगता है - इस तरह से है , इस तरह के पुनरावृत्ति को numpy < 1.6.0 के संस्करणों में किया जाना चाहिए?

उत्तर

3

कैसे concatenating के बारे में एक सरणी में दो वैक्टर:

for x,y in np.c_[t,s]: 
    print("xy: %f:%f" % (x,y)) 

इससे

xy: 0.000000:0.000000 
xy: 0.250000:1.000000 
xy: 0.500000:0.000000 
xy: 0.750000:-1.000000 
xy: 1.000000:-0.000000 
xy: 1.250000:1.000000 

आप दोहराना चाहते हैं ताकि आप स्मृति बचा सकते हैं चाहते हैं, आप itertools.izip फ़ंक्शन का उपयोग कर सकते हैं:

for x,y in itertools.izip(t,s): 
    print("xy: %f:%f" % (x,y)) 
0

for x, y in zip(t,s):। 1 डी सरणी के लिए, यह वास्तव में इतना आसान है।

दोनों पायथन 2 और पायथन 3 में काम करने के लिए सत्यापित किया गया है। ज़िप() पाइथन 2 पर एक सूची देता है, इसलिए डिजीजीएफ सुझाव देता है, itertools.izip() बड़े सरणी के लिए अधिक उपयुक्त हो सकता है।

> 1 डी सरणी के लिए, पुनरावृत्ति अंतिम आयाम लौटने (एन -1) डी सरणी के माध्यम से चलता है। यदि आपको एन-डी सरणी से निपटना है, तो यह हो सकता है कि आप जो चाहें हो या न हो।

भले ही, यह निर्विवाद रूप से पोर्टेबल है, और सरणी वस्तुओं पर पुनरावृत्ति का उद्देश्य इस तरह के उपयोगकेस का समर्थन करना है :)

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