2009-11-24 7 views
6

मान लीजिए मैं एक ही dtype के साथ दो recarrays बनाने के उनके ढेर:, cउनके recarrayness खोने के बिना numpy recarrays स्टैकिंग

>>> import numpy as np 
>>> dt = [('foo', int), ('bar', float)] 
>>> a = np.empty(2, dtype=dt).view(np.recarray) 
>>> b = np.empty(3, dtype=dt).view(np.recarray) 
>>> c = np.hstack((a,b)) 

a हालांकि और b recarrays हैं नहीं है:

>>> c.foo 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'numpy.ndarray' object has no attribute 'foo' 
>>> d = c.view(np.recarray) 
>>> d.foo 
array([     0,  111050731618561,     0, 
        7718048, 8246760947200437872]) 

मैं कर सकते हैं स्पष्ट रूप से इसे फिर से एक पुनरावृत्ति में बदल दें, जैसा ऊपर d के साथ दिखाया गया है, लेकिन यह असुविधाजनक है। क्या कोई कारण है कि दो पुनरावृत्तियों को ढंकना एक और पुनरावृत्ति उत्पन्न नहीं करता है?

उत्तर

6

मुझे नहीं पता। सबसे अधिक संभावना है कि यह एक बग/फीचर है जिसे कभी लागू नहीं किया गया है। numpy.hstack मूल रूप से numpy.core.fromnumeric में फ़ंक्शन के चारों ओर एक रैपर है। न्यूमेरिक numpy के दो पूर्ववर्तियों में से एक है। Numpy में अधिकांश कार्यों में आउटपुट पर इनपुट के __array_wrap__ को कॉल करके इनपुट के समान प्रकार के आउटपुट के लिए एक सम्मेलन होता है, और परिणामी आउटपुट में एक ही डेटा होना चाहिए, लेकिन नई कक्षा में "लपेटा" होना चाहिए। शायद "रैपिंग" की अवधारणा संख्यात्मक नहीं थी, और इस समारोह में कभी भी जोड़ा नहीं गया था।

आप एक चालाक स्टैकिंग समारोह

def hstack2(arrays) : 
    return arrays[0].__array_wrap__(numpy.hstack(arrays)) 

यह दोनों recarrays और नियमित रूप से सरणियों

>>> f = hstack2((a,b)) 
>>> type(f) 
<class 'numpy.core.records.recarray'> 
>>> f.foo 
array([ 140633760262784,  111050731618561,  140633760262800, 
        7536928, 8391166428122670177]) 
>>> x = numpy.random.rand(3) 
>>> y = numpy.random.rand(2) 
>>> z = hstack2((x,y)) 
>>> type(z) 
<type 'numpy.ndarray'> 

मैं तुम्हें क्या योजना बना रहे हैं यकीन नहीं है के लिए काम करता बनाने के लिए इस तकनीक का उपयोग कर सकते हैं, लेकिन आप हो सकता है कि numpy mailing list पर पूछना चाहें, दस्तावेज का उपयोग करने का एक बेहतर तरीका है, लेकिन डबल-अंडरस्कोर विधि, और लपेटने के लिए उनका तर्क क्या है।

-1

संयोग से, आप भी उपयोग कर सकते हैं:

c = np.concatenate((a,b)) 

या

c = np.r_[a, b] 

(स्रोत: this mailing list message)

+1

वे पुनरावृत्ति को संरक्षित नहीं करते हैं। –

5

वैकल्पिक रूप से, numpy.lib.recfunctions में कुछ सहायक उपयोगिताओं जो मैं here भर में ठोकर खाई है।

from numpy.lib.recfunctions import stack_arrays 
c = stack_arrays((a, b), asrecarray=True, usemask=False) 
c.foo 
>>> array([  140239282560000,   4376479720, -4611686018427387904, 
        4358733828,   4365061216]) 

एक एक recarray करने के लिए अतिरिक्त स्तंभ जोड़ने के लिए करना चाहता है, तो यह किया जा सकता है merge_arrays का उपयोग कर: इस मॉड्यूल दोनों के विलय और recarrays stacking के लिए कार्य करता है

import numpy as np 
from numpy.lib.recfunctions import merge_arrays 
dt1 = [('foo', int), ('bar', float)] 
dt2 = [('foobar', int), ('barfoo', float)] 
aa = np.empty(6, dtype=dt1).view(np.recarray) 
bb = np.empty(6, dtype=dt2).view(np.recarray) 

cc = merge_arrays((aa, bb), asrecarray=True, flatten=True) 
type(cc) 
>>> numpy.core.records.recarray 

(हालांकि का उत्तर नहीं प्रश्न, मैं बाद के उदाहरण को संदर्भ के रूप में पोस्ट कर रहा हूं)

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