Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在函数内部更改的数组的维度_Python_Arrays_Numpy - Fatal编程技术网

Python 在函数内部更改的数组的维度

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

我编写了一个函数来处理数组

我将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))
退换商品
因为
*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。再次感谢!谢谢大家!