2013-05-21 16 views
6

Dlaczego wstawienie nowej osi powoduje, że dane nie sąsiadują?numpy wstawianie osi sprawia, że ​​dane nie sąsiadujące

>>> a = np.arange(12).reshape(3,4,order='F') 
>>> a 
array([[ 0, 3, 6, 9], 
     [ 1, 4, 7, 10], 
     [ 2, 5, 8, 11]]) 
>>> a.reshape((3,1,4)).flags 
    C_CONTIGUOUS : False 
    F_CONTIGUOUS : False 
    OWNDATA : False 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 
>>> a[np.newaxis,...].flags 
    C_CONTIGUOUS : False 
    F_CONTIGUOUS : False 
    OWNDATA : False 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 
>>> a.flags 
    C_CONTIGUOUS : False 
    F_CONTIGUOUS : True 
    OWNDATA : False 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 

Zauważ, że jeśli używam C zamawiania, to jednak utrzymać ciągły dane kiedy zmienią, ale nie kiedy dodać nową oś:

>>> a 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
>>> a.flags 
    C_CONTIGUOUS : True 
    F_CONTIGUOUS : False 
    OWNDATA : False 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 

>>> a.reshape(3,1,4).flags 
    C_CONTIGUOUS : True 
    F_CONTIGUOUS : False 
    OWNDATA : False 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 
>>> a[np.newaxis,...].flags 
    C_CONTIGUOUS : False 
    F_CONTIGUOUS : False 
    OWNDATA : False 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 

aktualizacji Dla tych, którzy mogą znaleźć to w wyszukiwanie, aby zachować bieżącą kolejność tablic w przekształceniu, a.reshape(3,1,4,order='A') działa i utrzymuje przyległe tablice sąsiednie.


Dla tych, pytając „dlaczego cię to obchodzi?” Jest to część scenariusza, który jest przechodzącej tablice w Fortran celu niektórych Fortran podprogramów opracowanych przez f2py. Procedury fortranowe wymagają danych 3D, więc uzupełniam tablice o nowe wymiary, aby uzyskać wymaganą liczbę wymiarów. Chciałbym zachować ciągłe dane, aby uniknąć zachowań związanych z kopiowaniem/kopiowaniem.

+3

Cóż to dziwne ... –

+1

@JoeKington - Tak. Też tak myślałem. Ponieważ odkryłem 'order = 'A'', mogę po prostu użyć' ndarray.reshape'. Wolałbym 'np.newaxis' chociaż jako' data = a [newaxis, ...] 'wydaje się być czystszy niż' data = a.reshape ((1,) + a.shape, order = 'A') ' – mgilson

+0

Założę się, że odnosi się to do gigantycznej dyskusji na liście numpy, która ostatnio się pojawiła: http://numpy-discussion.10968.n7.nabble.com/Raveling-reshape-order-keyword-niepotrzebnie-zapasuje-index-and-memory -ordering-td33355.html Z pewnością zgadzam się, że jest to mylące! Nigdy bym nie przypuszczał, że zrobi to cięcie przez "newaxis"! –

Odpowiedz

1

To nie jest odpowiedź na pytanie, ale może się przydać: Można również skorzystać z numpy.require np.require(a[np.newaxis,...], requirements='FA').flags
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False

Powiązane problemy