Я думаю, что вы просто смотрите на неправильный фрагмент вашего массива.Следующее должно делать то, что вы хотите.
>>> X[(X.sum(2)>12),:] -= 1
>>> X
array([[[1, 1, 1, 1],
[2, 2, 2, 2]],
[[3, 3, 3, 3],
[3, 3, 3, 3]]])
Вернуться к исходному порядку немного сложнее.Я уверен, что вы можете изменить приведенный ниже код в функцию с именем get_back()
или что-то подобное, чтобы вам не приходилось использовать это постоянно.
import numpy as np
X = np.asarray([[[1,1,1,1],[2,2,2,2]],[[3,3,3,3],[4,4,4,4]]])
print X
# Make the change to the array
# Note that I make the change to +=1 so we can indeed see that
# the reshaping worked by looking for the 5's.
X[(X.sum(2)>12),:] += 1
(M,N,P) = X.shape; # Number of tiles is MxN
orig_i = 2; orig_j = 2; # (Original rows/cols in a tile).
orig = (orig_i, orig_j) # Define as a tuple for convenience.
hstacks = []
for ii in range(M):
hstacks.append(X[ii,0,:].reshape(orig))
for jj in range(1,N):
hstacks[-1] = np.hstack(( hstacks[-1], X[ii,jj,:].reshape(orig) ))
orig_array = hstacks[0]
for kk in range(1,len(hstacks)):
orig_array = np.vstack(( orig_array, hstacks[kk] ))
# Print to confirm that it worked.
print orig_array
Я получаю следующее:
>>> [[[1 1 1 1]
[2 2 2 2]]
[[3 3 3 3]
[4 4 4 4]]]
>>> [[1 1 2 2]
[1 1 2 2]
[3 3 5 5]
[3 3 5 5]]
И, чтобы проверить, я попробовал это с большим рисунком плиток, и это дает правильный результат.Обратите внимание, что я использую функцию get_back()
для инкапсуляции приведенного выше кода, и я просто жестко запрограммировал параметры измерения листов в функцию.На самом деле они должны быть входными параметрами.
>>> X = np.asarray([[[1,1,1,1],[2,2,2,2],[3,3,3,3]],
[[4,4,4,4],[5,5,5,5],[6,6,6,6]]])
>>> X
array([[[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]],
[[4, 4, 4, 4],
[5, 5, 5, 5],
[6, 6, 6, 6]]])
>>> get_back(X)
array([[1 1 2 2 3 3]
[1 1 2 2 3 3]
[4 4 5 5 6 6]
[4 4 5 5 6 6]])