Python 在函数内部更改的数组的维度
我编写了一个函数来处理数组 我将2D数组作为“someFunc(*dna)”传递到函数中,但在函数内部,结果是3D数组 为什么维度发生了变化?如何保持在函数中传递的参数的相同维度Python 在函数内部更改的数组的维度,python,arrays,numpy,Python,Arrays,Numpy,我编写了一个函数来处理数组 我将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))
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))
退换商品
因为
*dna
将传递的参数收集到。所以你所做的是平等的
def someFunc(dna):
return np.shape([dna]) # Notice extra brackets
要保持相同的维度,只需删除
dna
之前的*即可,因为*dna
将传递的参数收集到。所以你所做的是平等的
def someFunc(dna):
return np.shape([dna]) # Notice extra brackets
要保持相同的维度,只需删除*before
dna
有两个问题-*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]])
有两个问题-
*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]])
为什么
*dna
而不是普通的dna
?顺便说一句,import random
是毫无意义的-你不是在使用标准的random
模块,你是在使用Numpy自己的random
函数。你为什么想要一个函数来实现这一点?您只需访问数组的.shape
属性:q.shape
@hpaulj,因为我的实际代码非常大,我不想将所有代码都转储到这里,这意味着更少。我想解压数组(dna)中的所有元素,而不仅仅是摆弄它的索引或形状,我在这里提到了()。为了便于访问(dna中的)元素,我希望保持变量“q”*dna
的相同维度解压元组或列表,而不是数组。看看函数内部的dna
——它是一个1元素元组。为什么*dna
而不是普通的dna
?顺便说一句,导入随机的是毫无意义的——你没有使用标准的随机的模块,你使用的是Numpy自己的随机的函数。你为什么想要一个这样的函数?您只需访问数组的.shape
属性:q.shape
@hpaulj,因为我的实际代码非常大,我不想将所有代码都转储到这里,这意味着更少。我想解压数组(dna)中的所有元素,而不仅仅是摆弄它的索引或形状,我在这里提到了()。为了便于访问(dna中的)元素,我希望保持变量“q”*dna
的相同维度解压元组或列表,而不是数组。看看函数中的dna
——这是一个1元素元组。你很快就把今年的括号配额烧掉了:P@AndrasDeak回收它们。:)你很快就完成了今年的括号配额:P@AndrasDeak回收它们。:)太好了。如果不清楚Python的控制流,就很难从MATLAB转换到Python。再次感谢!谢谢大家!太好了。如果不清楚Python的控制流,就很难从MATLAB转换到Python。再次感谢!谢谢大家!