2 votes

Passage de la nouvelle forme à `np.reshape`.

Sur numpy.ndarray.reshape le shape est un paramètre int ou tuple d'ints y

La nouvelle forme doit être compatible avec la forme originale. Si un entier, alors le résultat sera un tableau 1-D de cette longueur.

La signature de la documentation est juste :

# Note this question doesn't apply to the function version, `np.reshape`
np.ndarray.reshape(shape, order='C')

Dans la pratique, la spécification ne semble pas être aussi stricte. D'après la description ci-dessus, je m'attendrais à devoir utiliser :

import numpy as np
a = np.arange(12)
b = a.reshape((4,3))  # (4,3) is passed to `newshape`

Mais à la place, je peux m'en sortir avec juste :

c = a.reshape(4,3)  # Seems like just 4 would be passed to `newshape`
                    #     and 3 would be passed to next parameter, `order`
print(np.array_equal(b,c))
# True

Comment est-ce que je peux faire ça ? Je sais que si j'entre simplement 2, 3 dans un shell Python, c'est techniquement un tuple, que j'utilise des parenthèses ou non. Mais la comparaison ci-dessus semble violer les lois de base sur la façon dont les paramètres positionnels sont passés au dict des mots-clés args. C'est à dire :

def f(a, b=1, order='c'):
    print(a)
    print(b)

f((4,3))
print()
f(4,3)

# (4, 3)
# 1
#
# 4
# 3

...et il n'y a pas d'opérateurs en étoile en reshape . (Quelque chose de semblable à def f(*a, order='c') ci-dessus).

2voto

lehiester Points 612

Avec la manière dont les paramètres sont liés avec les méthodes Python normales, cela ne devrait pas fonctionner, mais la méthode n'est pas du tout une méthode Python. Numpy est un module d'extension pour CPython, et numpy.ndarray.reshape est en fait mis en œuvre en C .

Si vous regardez l'implémentation, le order n'est jamais lu comme un argument de mot-clé. Un argument positionnel ne sera jamais lié à lui, contrairement à une méthode Python normale où le second argument positionnel serait lié à order . Le code C essaie de construire la valeur de newshape de tous les arguments positionnels.

2voto

user2357112 Points 37737

Il n'y a rien de magique. La signature de la fonction ne correspond tout simplement pas à la documentation. Elle est documentée comme

ndarray.reshape(shape, order='C')

mais il est écrit en C, et au lieu de faire l'équivalent C-api de

def reshape(self, shape, order='C'):

il fait l'équivalent en C-api du manuel *args y **kwargs la manipulation. Vous pouvez jeter un coup d'œil dans numpy/core/src/multiarray/methods.c . (Notez que l'équivalent C-api de def reshape(self, shape, order='C'): aurait la même signature au niveau du C que ce que fait le code actuel, mais il utiliserait immédiatement quelque chose comme PyArg_ParseTupleAndKeywords pour analyser les arguments au lieu de faire une manipulation manuelle).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X