2017-04-18 52 views
0

我在使用非連續數組的代碼中遇到問題。 尤其是我得到以下警告消息:column_stack返回非模糊數組

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 " 

我使用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 

但我得到一個非連續的數組

你知不知道我怎樣才能contigous陣列?我應該在column_stack之後始終使用ascontiguousarray

+1

你是什麼意思,由'連續'在這裏?你的意思是[像這樣](http://stackoverflow.com/questions/26998223/what-is-the-difference-between-contiguous-and-non-contiguous-arrays)? 'np.column_stack'只是將輸入堆疊爲列,這就是它所做的事情,然而當輸入被輸入時,hstack會按順序將這些輸入堆疊起來,這是兩種不同的操作。 – Divakar

+0

[無法重現。](http://ideone.com/OgF4Xd)結果對我來說是連續的。 – user2357112

+0

請參閱我的編輯... – gabboshow

回答

0

np.stack([x, y])不是連續的。但是,np.stack([x, y]).T是。

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

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

相反:

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 

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) 

該測試,對column_stack是確定的:

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

正常構建的二維數組是contiguous。但是他們的轉置是F-contiguous。警告是np.ascontiguousarray將生成副本。對於可能成爲問題的非常大的陣列。

如果此警告經常出現,您可以在調用此函數之前抑制它,或者經常使用ascontiguousarray

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