So erstellen Sie ein strukturiertes Array aus mehreren einfachen Arrays

  •  import numpy as np
    
    a=np.array([1,2,3,4,5,6,7,8,9])
    b=np.array(["a","b","c","d","e","f","g","h","i"])
    c=np.array([9,8,7,6,5,4,3,2,1])
    datatype=np.dtype({
     'names':['num','char','len'],
     'formats':['i','S32','i']
    })
    
    d=np.array(zip(a,b,c),dtype=datatype)
     

    Der obige Code verwendet zip (), um zuerst eine Liste zu erstellen und diese dann in ein strukturiertes Array zu konvertieren. Es ist eine geringe Effizienz. Ich möchte wissen, ob es in NumPy integrierte Funktionen gibt, die dies ermöglichen.

    22 November 2011
    HYRY
2 answers
  • Sie könnten es auch numpy.rec.fromarrays versuchen.

     import numpy as np
    
    a=np.array([1,2,3,4,5,6,7,8,9])
    b=np.array(["a","b","c","d","e","f","g","h","i"])
    c=np.array([9,8,7,6,5,4,3,2,1])
    
    d = np.rec.fromarrays([a,b,c], formats=['i','S32','i'], names=['num','char','len'])
     

    Obwohl die Timings nicht so gut sind als Verwendung von itertools.

     In [2]: %timeit d = np.rec.fromarrays([a,b,c], formats=['i','S32','i'], names=['num','char','len'])
    10000 loops, best of 3: 86.5 us per loop
    
    In [6]: import itertools
    
    In [7]: %timeit np.fromiter(itertools.izip(a,b,c),dtype=datatype)
    100000 loops, best of 3: 11.5 us per loop
     
    22 November 2011
    Andrey Sobolev
  • zip erstellt eine Liste von Tupeln, die speicherintensiv sein kann, wenn die Arrays groß sind. Sie können itertools.izip verwenden, um speichereffizienter zu sein:

     import itertools
    d=np.fromiter(itertools.izip(a,b,c),dtype=datatype)
     

    Für kleine Arrays der Länge ~ 10:

     In [68]: %timeit np.fromiter(itertools.izip(a,b,c),dtype=datatype)
    100000 loops, best of 3: 15.8 us per loop
    
    In [69]: %timeit np.array(zip(a,b,c),dtype=datatype)
    10000 loops, best of 3: 20.8 us per loop
     

    Für Arrays der Länge ~ 10000:

     In [72]: A=np.tile(a,1000)
    In [74]: B=np.tile(b,1000)
    In [75]: C=np.tile(c,1000)
    
    In [83]: %timeit np.fromiter(itertools.izip(A,B,C),dtype=datatype)
    100 loops, best of 3: 10.7 ms per loop
    
    In [84]: %timeit np.array(zip(A,B,C),dtype=datatype)
    100 loops, best of 3: 12.7 ms per loop
     

    Also scheint np.fromiter etwas schneller zu sein als np.array.

    22 November 2011
    unutbuSammi De Guzman