2017-04-18 5 views
0

J'ai un problème avec mon code avec des tableaux non contigus. En particulier, je reçois le message d'avertissement suivant:column_stack renvoie un tableau non-cotigueux

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 " 

J'utilise np.column_stack

import numpy as np 
x = np.array([1,2,3,4]) 

y = np.array([5,6,7,8]) 

stack = np.column_stack((x,y)) 

stack.flags.f_contiguous 
Out[2]: False 

mais je reçois un tableau non contigu

Savez-vous comment puis-je obtenir tableau Contigous? devrais-je utiliser toujours ascontiguousarray après column_stack?

+1

Que voulez-vous dire par 'contiguous' ici? Voulez-vous dire quelque chose [comme ceci] (http://stackoverflow.com/questions/26998223/what-is-the-difference-between-contiguous-and-non-contiguous-arrays)? 'np.column_stack' empilerait simplement les entrées comme des colonnes, ce qui est ce qu'il fait, alors que hstack les empilerait horizontalement dans la séquence comme les entrées sont alimentées, deux opérations différentes. – Divakar

+0

[Impossible de reproduire.] (Http://ideone.com/OgF4Xd) Le résultat est contigu pour moi. – user2357112

+0

s'il vous plaît voir mon edit ... – gabboshow

Répondre

0

np.stack([x, y]) n'est pas contiguë. Cependant, np.stack([x, y]).T est.

np.stack([x, y]) # Transpose of what you want and not contiguous 

array([[1, 2, 3, 4], 
     [5, 6, 7, 8]]) 

Au lieu de cela:

stack = np.stack([x, y]).T 
0
In [276]: xy=np.column_stack((x,y)) 
In [277]: np.info(xy) 
class: ndarray 
shape: (4, 2) 
strides: (8, 4) 
itemsize: 4 
aligned: True 
contiguous: True 
fortran: False 
data pointer: 0xa836ec0 
byteorder: little 
byteswap: False 
type: int32 

Le code skimage, https://github.com/scikit-image/scikit-image/blob/master/skimage/util/shape.py

# -- build rolling window view 
if not arr_in.flags.contiguous: 
    warn(RuntimeWarning("Cannot provide views on a non-contiguous input " 
         "array without copying.")) 

arr_in = np.ascontiguousarray(arr_in) 

Ce test, le column_stack est ok:

In [278]: xy.flags.contiguous 
Out[278]: True 
In [279]: xy.T.flags.contiguous 
Out[279]: False 

Les matrices 2d normalement construites sont contiguous. Mais leur transposition est F-contiguous. L'avertissement est que np.ascontiguousarray produira une copie. Pour les très grandes baies qui pourraient poser problème.

Si cet avertissement s'affiche souvent, vous pouvez le supprimer ou utiliser régulièrement ascontiguousarray avant d'appeler cette fonction.

RuntimeWarning: Cannot provide views on a non-contiguous input array without copying