我写了一个处理数组的函数。
我将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)
答案 0 :(得分:2)
因为*dna
会将传递的参数收集到tuple中。所以你所做的就等于
def someFunc(dna):
return np.shape([dna]) # Notice extra brackets
要保持相同的尺寸,只需在dna
之前删除*。
答案 1 :(得分:0)
有两个问题 - *args
做了什么,以及元组的形状是什么。
正确使用* 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]])