Изменение формы массива Python определенным образом
Я работаю над кодом Python, так что я могу в основном сделать это с Numpy Array
У меня есть код Matlab для него, который
A = [1:30]'; % Example matrix
rows = 3;
for i=1:(numel(A)-rows+1)
B(1:rows,i)=A(i:i+rows-1,1);
end
или без всякой петли,
B = conv2(A.', flip(eye(rows)));
B = B(:, rows:end-rows+1);
Может ли кто-нибудь помочь мне сделать то же самое в Python? Использование функции изменения формы не помогает, так как мне нужно "отражать" значения (а не только реорганизовывать их).
Спасибо.
4 ответа
Решение
Не очень сексуально, но не для
import numpy as np
a = np.arange(1,31)
b = np.arange(3).reshape(3,1)
c = b+a[:28]
пытаясь перевести ваш код Matlab
import numpy as np
from scipy.signal import convolve2d
a = np.arange(1,31).reshape(1,30)
b = np.flip(np.eye(3,28),0)
c = convolve2d(a, b)[:,2:28]
Это код для вас.
import numpy as np
A = np.array(list(range(1,31)))
rows = 3
new_A = np.zeros((rows,A.size-rows+1))
for i in range(rows):
new_A[i,:] = A[i:A.size-rows+i+1]
print (new_A)
Попробуйте этот фрагмент кода:
import numpy as np
start = 1
end = 30
b_dim = 28
a = np.arange(start, end+1)
b = np.zeros((3, b_dim))
print("a = ", a)
rows, _ = b.shape
for row in range(rows):
data = a[row:row+b_dim]
b[row, :] = data
print("b = ", b)
это печатает
('a = ', array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]))
('b = ', array([[ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11.,
12., 13., 14., 15., 16., 17., 18., 19., 20., 21., 22.,
23., 24., 25., 26., 27., 28.],
[ 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.,
13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23.,
24., 25., 26., 27., 28., 29.],
[ 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13.,
14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24.,
25., 26., 27., 28., 29., 30.]]))
С помощью np.ndarray.reshape
:
import numpy as np
A = np.arange(1, 31)
B = A.reshape((3, 10))
print(B)
[[ 1 2 3 4 5 6 7 8 9 10]
[11 12 13 14 15 16 17 18 19 20]
[21 22 23 24 25 26 27 28 29 30]]