2017-04-12 4 views
1

lors de l'utilisation skimage je reçois l'erreur suivante:RuntimeWarning: ne peut pas fournir des vues sur un tableau d'entrée non contiguës sans copier

win = skimage.util.view_as_windows(x, windowSize, windowShift) 

C:\Program Files\Anaconda2\lib\site-packages\skimage\util\shape.py:247: RuntimeWarning: Cannot provide views on a non-contiguous input array without copying. 
    warn(RuntimeWarning("Cannot provide views on a non-contiguous input " 

jusqu'à ce que je compris parce que x est un tableau non contigu.

Je pense que je résolu le problème en ajoutant dans mon code np.ascontiguousarray comme ci-dessous:

win = skimage.util.view_as_windows(np.ascontiguousarray(x), windowSize, windowShift) 

Est-ce la bonne chose à faire? Note: Je le fais tout le temps que j'appelle cette fonction de skimage ... a-t-elle une implication particulière?

+0

Comment créez-vous ce 'x'? Je doute que les développeurs 'skimage' s'attendent à ce que vous voyiez cet avertissement chaque fois que vous utilisez cet utilitaire. Les tableaux non contigus ne sont pas communs. – hpaulj

+0

Je l'ai lu à partir d'un fichier matlab en utilisant scipy ..... – gabboshow

+0

Je peux utiliser np.ascontigousarray() quand je charge x la première fois ... est-ce OK? – gabboshow

Répondre

2
In [44]: from scipy.io import loadmat 
In [45]: d = loadmat('test7.mat') 
In [46]: d 
Out[46]: 
{'__globals__': [], 
'__header__': b'MATLAB 5.0 MAT-file, written by Octave 4.0.0, 2016-09-01 15:43:02 UTC', 
'__version__': '1.0', 
'x': array([[ 1., 2., 3.], 
     [ 4., 5., 6.]])} 

In [48]: np.info(d['x']) 
class: ndarray 
shape: (2, 3) 
strides: (8, 16) 
itemsize: 8 
aligned: True 
contiguous: False 
fortran: True 
data pointer: 0xabfa13d8 
byteorder: little 
byteswap: False 
type: float64 
In [49]: 

ou l'attribut FLAGS:

In [52]: x.flags 
Out[52]: 
    C_CONTIGUOUS : False 
    F_CONTIGUOUS : True 
    OWNDATA : False 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 
In [54]: d['x'].flags['C_CONTIGUOUS'] 
Out[54]: False 
In [55]: d['x'].flags['F_CONTIGUOUS'] 
Out[55]: True 

np.ascontiguous fait exactement

array(a, dtype, copy=False, order='C', ndmin=1) 

Il ne fait que une copie (du DataBuffer) si nécessaire pour obtenir le bon ordre. Voir les docs np.array pour plus de détails. x.copy() ferait une copie indépendamment.

Un ascontiguous appel à tous les tableaux loadmat est logique si vous allez les utiliser dans le code skimage qui attend C tableaux contigus. view_as_windows est probablement en train de faire quelques trucs pour faire une fenêtre (coulissante).