2017-05-28 3 views
0

Ich schrieb eine Funktion zum Umgang mit Arrays.Dimension eines Arrays innerhalb der Funktion geändert

Ich übergab das 2D-Array in die Funktion als "someFunc (* dna)", aber innerhalb der Funktion erwies es sich als 3D.

Warum hat sich die Dimension geändert? Wie kann ich die gleiche Dimension des Arguments beibehalten, das ich in der Funktion übergeben habe?

import numpy as np 
import random 

q=np.random.random((5,4)) 

def someFunc(*dna): 
    return ((np.shape(dna))) 

print (q) 
print (np.shape(q)) 
print(someFunc(q)) 

Returns

[[ 0.87994033 0.85120494 0.75284745 0.48595008] 
[ 0.71889884 0.95544306 0.70028042 0.30932712] 
[ 0.04329341 0.46292282 0.35225021 0.08891277] 
[ 0.9704255 0.92635685 0.56120996 0.19240052] 
[ 0.27435325 0.71029224 0.55805384 0.26967641]] 
(5, 4) 
(1, 5, 4) 
+2

Warum ' * dna' statt einfacher 'dna'? – hpaulj

+0

BTW, dass "Import zufällig" ist sinnlos - Sie verwenden nicht das Standard-'random' Modul, Sie verwenden Numpy's eigene' random' Funktion. –

+0

Warum wollen Sie sogar eine Funktion dafür? Sie können einfach auf das '.shape'-Attribut des Arrays zugreifen:' q.shape' –

Antwort

0

Es gibt zwei Probleme - was *args tut, und was ist die Form eines Tupels.

Die richtige Verwendung von * arg Elemente eines Tupels zu erhalten:

def foo(*dna): 
    a,b,c = dna 
    print(dna, a) 

3 Argumente Giving Works, 1 geben, auch ein Tupel nicht:

In [235]: foo(1,2,3) 
(1, 2, 3) 1 
In [236]: foo((1,2,3)) 
... 
ValueError: not enough values to unpack (expected 3, got 1) 

Hinzufügen eines * in der Eingang packt sie aus:

In [237]: foo(*(1,2,3)) 
(1, 2, 3) 1 

das gleiche gilt für einen Array:

In [238]: foo(np.arange(3)) 
... 
ValueError: not enough values to unpack (expected 3, got 1) 
In [239]: foo(*np.arange(3)) 
(0, 1, 2) 0 

args ist ein Tupel, unabhängig davon, was vorgesehen ist:

def bar(*args): 
    return args 

In [241]: bar(1,2,3) 
Out[241]: (1, 2, 3) 
In [242]: bar((1,2,3)) 
Out[242]: ((1, 2, 3),) # note the extra tuple wrapping 
In [243]: bar(*(1,2,3)) # unpack as in 241 
Out[243]: (1, 2, 3) 
In [244]: bar(np.arange(3)) 
Out[244]: (array([0, 1, 2]),) # again, the tuple wrapping 
In [245]: bar(*np.arange(3)) 
Out[245]: (0, 1, 2) 

die Form eines Tupels Mengen Unter der Form des Arrays zu nehmen aus dem Tupel gebildet

In [247]: np.shape((np.arange(3),)) 
Out[247]: (1, 3) 
In [249]: np.array((np.arange(3),)) 
Out[249]: array([[0, 1, 2]]) 
+0

Das ist perfekt. Es ist wirklich schwierig, von MATLAB zu Python zu wechseln, ohne eine klare Vorstellung von Pythons Kontrollfluss zu haben. Danke noch einmal! Danke euch allen! –

2

Da *dna sammelt Argumente in tuple geben. Also, was Sie haben gleich getan

def someFunc(dna): 
    return np.shape([dna]) # Notice extra brackets 

die gleiche Dimension zu halten, nur * entfernen, bevor dna.

+0

Sie brennen durch die diesjährige Klammer Quote wirklich schnell: P –

+1

@AndrasDeak Recycled sie. :) – gzc

Verwandte Themen