Я написал функцию для обработки массивов.

Я передал 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
sarannns 28 Май 2017 в 18:13

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]])
0
hpaulj 28 Май 2017 в 16:26

Потому что *dna собирает переданные аргументы в кортеж . Так что вы сделали равных

def someFunc(dna):
    return np.shape([dna]) # Notice extra brackets

Чтобы сохранить то же измерение, просто удалите * перед dna.

2
gzc 28 Май 2017 в 15:49