函数内部更改了数组的维数

时间:2017-05-28 15:13:31

标签: 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))

返回

[[ 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 个答案:

答案 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]])