2017-05-28 50 views
0

我編寫了一個處理數組的函數。在函數內部更改了數組的維數

我把2D數組作爲「someFunc(* dna)」函數傳入函數,但是在函數內部,它變成了3D。

爲什麼尺寸有變化?我如何保持我在函數內部傳遞的參數的相同維度?

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)) 

返回

[[ 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

爲什麼'形成的形狀* dna'而不是普通的'dna'? – hpaulj

+0

順便說一句,'輸入隨機'是毫無意義的 - 你沒有使用標準的'隨機'模塊,你正在使用Numpy自己的'隨機'功能。 –

+0

爲什麼甚至想要這個功能?你可以簡單地訪問數組的'.shape'屬性:'q.shape' –

回答

0

有兩個問題--做什麼,以及元組的形狀是什麼。

正確使用* arg的是接收一個元組的元素:

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

給予3個參數的作品,給予1,甚至一個元組不會:

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) 

添加在*輸入分離這些:

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

也是一樣的數組:

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是一個元組,而不管設置什麼:

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) 

以元組量的形狀,以取該陣列的從元組

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

這是完美的。如果沒有關於python控制流的清晰概念,真的很難從MATLAB轉向Python。再次感謝! 謝謝大家! –

2

因爲*dna收集傳遞的參數爲tuple。所以,你做了什麼等於

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

要保持相同的尺寸,只是刪除* dna之前。

+0

你真正快速燃燒今年的括號內配額:P –

+1

@AndrasDeak回收它們。 :) – gzc