2017-10-11 55 views
2

一個3乘N陣列的緊湊規格我有大n一個3 x n numpy的陣列,其被明確地指定,例如,而不重新排列存儲器

import numpy 

a = numpy.array([ 
    [ 
     +0.000867019185663, 
     +0.011660052716448, 
     +0.022876936356421, 
     +0.030448982673938, 
     # [...] 
    ], [ 
     0.500950464352200, 
     0.488212957934729, 
     0.455136681950283, 
     0.455136681950283, 
     # [...] 
    ], [ 
     0.600950464352200, 
     0.188212957934729, 
     0.155136681950283, 
     0.188212957934729, 
     # [...] 
    ]]) 

爲了使代碼更緊湊,我通常指定a作爲轉置

a = numpy.array([ 
    [+0.000867019185663, 0.500950464352200, 0.600950464352200], 
    [+0.011660052716448, 0.488212957934729, 0.188212957934729], 
    [+0.022876936356421, 0.455136681950283, 0.155136681950283], 
    [+0.030448982673938, 0.401996259318289, 0.101996259318289], 
    # [...] 
    ]).T 

然而,這給我一個非連續的陣列。我當然可以通過numpy.ascontiguousarray(或transpose()而不是T)使它連續,但我想避免重新排列內存。

有沒有一種方法來指定a在緊湊的形式,同時仍然得到一個連續的形狀陣列(3, n)

+0

是否可以選擇在需要時保留'a'一維矢量並重新定形,因爲'reshape'具有'order'關鍵字? – percusse

+0

複製:'a.T.copy()'? – Divakar

+0

@percusse我猜如果你先在'a.T'的內存中創建一個數組,然後重新構造它,那麼內存將不得不重新安排。 –

回答

1

如果您按照Fortran順序(列專業)指定了該數組,則它在轉置後將是C連續的。

實施例:

x = np.array([[1, 2, 3], [4, 5, 6]], order='F').T 

# verification 
y = np.ascontiguousarray(x) # should not make a copy if x is contiguous 
y[1] = 42 # modify y 
print(x) # x has changed (no copy was made) 

計數器例如:

x = np.array([[1, 2, 3], [4, 5, 6]], order='C').T 

# verification 
y = np.ascontiguousarray(x) # should make a copy if x is not contiguous 
y[1] = 42 # modify y 
print(x) # x has *not* changed (it was copied into y) 

備註:

我不認爲避免在這一階段存儲器重排有很大的實用價值。像這樣初始化一個數組會首先創建一個Python列表,在將其複製到新分配的數組後,該列表將被丟棄。一個更多的副本(陣列連續陣列)可能不是什麼大不了的...