2017-05-28 54 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