我希望能夠以某種方式對numpy數組重新排序以便高效處理tile。有效地將Numpy數組重新排列/重新排列爲正確排序的Tile(圖像)
我得到了什麼:
>>> A = np.array([[1,2],[3,4]]).repeat(2,0).repeat(2,1)
>>> A # image like array
array([[[1, 1, 2, 2],
[1, 1, 2, 2]],
[[3, 3, 4, 4],
[3, 3, 4, 4]]])
>>> A.reshape(2,2,4)
array([[[1, 1, 2, 2],
[1, 1, 2, 2]],
[[3, 3, 4, 4],
[3, 3, 4, 4]]])
我想要什麼:如何獲得X:
>>> X
array([[[1, 1, 1, 1],
[2, 2, 2, 2]],
[[3, 3, 3, 3],
[4, 4, 4, 4]]])
這是可能沒有一個緩慢的蟒蛇循環?
獎勵:轉換從X到後面有一個
巴戈指出了一個類似的問題,我已經錯過了:Creating a 4D view on 2D array to divide it into cells of fixed size
爲什麼所有的麻煩呢?爲了能夠做這樣的事情:
>>> X[X.sum(2)>12] -= 1
>>> X
array([[[1, 1, 1, 1],
[2, 2, 2, 2]],
[[3, 3, 3, 3],
[3, 3, 3, 3]]])
編輯:解:
# MIT - License
import numpy as np
def tile_reorder(A, t):
"""reshape and transpose quadratic array for easy access to quadratic tiles of size t"""
l = A.shape[0]/t
X = A.reshape((l, t, l, t))
X = X.transpose([0, 2, 1, 3])
return X
def tile_reorder_reverse(X):
l = X.shape[0] * X.shape[2]
A = X.transpose([0, 2, 1, 3])
A = A.reshape((l, l))
return A
if __name__ == "__main__":
A = np.array([[1,2,3],[3,4,5],[6,7,8]]).repeat(4,0).repeat(4,1)
print "A:\n", A, "\n\n"
print "A_tiled:\n", tile_reorder(A,4), "\n\n"
print "A_tiled_reversed:\n", tile_reorder_reverse(tile_reorder(A,4)), "\n\n"
X = tile_reorder(A,4)
X[X.sum((2)).sum(2)>63,:,:] += 10
B = tile_reorder_reverse(X)
print "B_processed:\n", B, "\n\n"
目前尚不清楚你的問題是什麼。您列出的代碼中哪一步不適合您。 NumPy確實有邏輯類型索引,有些像'X [X.sum(2)> 12]'應該有效。問題是你需要弄清楚你想要索引的數組的哪個維度。看起來你想說'X [:,:,X.sum(2)> 12] - = 1',因爲你想要混淆的索引只有那些有第三個索引,總和超過12 ,第一和第二個索引可以是任何東西。 – ely 2012-04-02 16:12:10
如果我明白你想要做什麼,轉換回是不可能的。您正在丟失信息,您正在將原始設置映射到較小的子集。 – Hooked 2012-04-02 16:12:44
希望我做得更清楚一點。索引不是造成皮塔的原因。 – Gonzo 2012-04-02 16:27:16