J'essaie d'obtenir une vue de 2D ndarray comme un enregistrement ou un tableau structuré sans copier. Cela semble fonctionner très bien si a
est propriétaire des donnéesObtenez une vue de recarray d'un ndarray (qui peut également être une vue)
>>> a = np.array([[ 1, 391, 14, 26],
[ 17, 371, 15, 30],
[641, 340, 4, 7]])
>>> b = a.view(zip('abcd',[a.dtype]*4))
array([[(1, 391, 14, 26)],
[(17, 371, 15, 30)],
[(641, 340, 4, 7)]],
dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8'), ('d', '<i8')])
>>> b.base is a
True
Mais si a
est déjà vue, cela ne fonctionne pas. Voici un exemple
>>> b = a[:,[0,2,1,3]]
>>> b.base is None
False
>>> b.view(zip('abcd',[a.dtype]*4))
ValueError: new type not compatible with array.
Fait intéressant, dans ce cas b.base
est une transposition de la vue
>>> (b.base == b.T).all()
True
Il est donc logique que numpy ne pouvait pas créer la vue de ce que je voulais.
Cependant, si j'utilise
>>> b = np.take(a,[0,2,1,3],axis=1)
Il en résulte b
être une copie correcte des données afin de prendre les travaux de vue recarray. Question secondaire: Quelqu'un peut-il expliquer ce comportement par opposition à l'indexation?
Ma question est, est-ce que je vais à ce sujet dans le mauvais sens? Est-ce que prendre une vue comme je le fais n'est pas supporté? Si oui, quelle serait la bonne façon de le faire?
merci! Je ne savais pas que la disposition de la mémoire pouvait changer comme ça. Pour être clair, je savais que l'indexation comme 'a [:, [0,2,1,3]' retournerait une copie, mais je ne savais pas que ça pourrait être 'F_CONTIGOUS' ou que' np.take' retourne toujours un 'C_CONTIGUOUS' (le doc numpy dit que' np.take' fait la même chose que l'indexation de fantaisie, ce qui semble faux dans ce cas). Comment géreriez-vous obtenir cette vue particulière (sans copie) d'une manière qui fonctionne toujours? Est-ce une mauvaise pratique de vérifier si le tableau est 'F \ C_CONTIGOUS'? – toes