82 votes

Comment savoir si NumPy crée une vue ou une copie ?

Pour un exemple de travail minimal, numérisons un tableau 2D. numpy.digitize nécessite un tableau 1D :

import numpy as np
N = 200
A = np.random.random((N, N))
X = np.linspace(0, 1, 20)
print np.digitize(A.ravel(), X).reshape((N, N))

Aujourd'hui, le la documentation dit :

... Une copie n'est faite qu'en cas de besoin.

Comment savoir si le ravel copie est "nécessaire" dans ce cas ? De manière générale, existe-t-il un moyen de déterminer si une opération particulière crée une copie ou une vue ?

87voto

mgilson Points 92954

Cette question est très similaire à une question que j'ai posée il y a quelque temps :

Vous pouvez vérifier le base attribut.

a = np.arange(50)
b = a.reshape((5, 10))
print (b.base is a)

Cependant, ce n'est pas parfait. Vous pouvez également vérifier s'ils partagent la mémoire en utilisant la fonction np.may_share_memory .

print (np.may_share_memory(a, b))

Vous pouvez également vérifier l'attribut flags :

print (b.flags['OWNDATA'])  #False -- apparently this is a view
e = np.ravel(b[:, 2])
print (e.flags['OWNDATA'])  #True -- Apparently this is a new numpy object.

Mais cette dernière me semble un peu louche, même si je n'arrive pas à mettre le doigt sur la raison...

21voto

amicitas Points 1925

Dans la documentation de remodeler il y a des informations sur la façon de garantir une exception si une vue ne peut pas être faite :

Il n'est pas toujours possible de modifier la forme d'un tableau sans copier les données. Si vous voulez qu'une erreur soit soulevée si les données sont copiées, vous devez assigner la nouvelle forme à l'attribut shape du tableau :

a = np.zeros((10, 2))

A transpose make the array non-contiguous

b = a.T

Taking a view makes it possible to modify the shape without modiying the

initial object.

c = b.view() c.shape = (20) AttributeError: incompatible shape for a non-contiguous array

Ce n'est pas exactement une réponse à votre question, mais dans certains cas, cela peut être tout aussi utile.

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