Объединение и изменение формы ndarray так, чтобы исходные значения каждого компонента были на первой оси - PullRequest
0 голосов
/ 09 октября 2019

Для пустых стеков и линейной алгебры вы хотите отформатировать данные со стеками на первой оси.

Например, чтобы использовать определитель , параметр должен быть похожим на массив, где последние две оси симметричны, например (x, M, M)

Как я могу переформатировать четыре отдельных уплощенных массива (соответствующих коэффициентам)матрицы 2x2) в такой формат?

Я возился с https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html#numpy.concatenate, https://docs.scipy.org/doc/numpy/reference/generated/numpy.block.html#numpy.block, и https://docs.scipy.org/doc/numpy/reference/generated/numpy.dstack.html,

, но до сих пор нетя получил его в формате, который мне нужен.

Например, я очень близко подхожу к

a = np.array([1, 2, 3, 4, 5])
b = np.array([10, 20, 30, 40, 50])
c = np.array([15, 16, 17, 18, 19])
d = np.array([100, 200, 300, 400, 500])
result = np.dstack((a, b, c, d))
result = np.reshape(result, (1, 5, 2, 2))
print("RESULT SHAPE", result.shape)
print("RESULT VALUE", result[:, :, 0, 0])
print("RESULT I REALLY WANT", result[:, 0, 0])

Не уверен, как уронить последнюю ось.

1 Ответ

1 голос
/ 09 октября 2019
In [250]: a = np.array([1, 2, 3, 4, 5]) 
     ...: b = np.array([10, 20, 30, 40, 50]) 
     ...: c = np.array([15, 16, 17, 18, 19]) 
     ...: d = np.array([100, 200, 300, 400, 500])      

np.stack - это версия concatenate, которая объединяет массивы на новой оси, которую мы можем выбрать:

In [251]: np.stack((a,b,c,d)).shape                                             
Out[251]: (4, 5)
In [252]: np.stack((a,b,c,d),1).shape                                           
Out[252]: (5, 4)

Затем мы можем изменить последнюю ось на (2,2):

In [253]: np.stack((a,b,c,d),1).reshape(5,2,2)                                  
Out[253]: 
array([[[  1,  10],
        [ 15, 100]],

       [[  2,  20],
        [ 16, 200]],

       [[  3,  30],
        [ 17, 300]],

       [[  4,  40],
        [ 18, 400]],

       [[  5,  50],
        [ 19, 500]]])

Первый стек такой же, как np.array:

In [254]: np.array((a,b,c,d)).shape                                             
Out[254]: (4, 5)
In [255]: np.array((a,b,c,d)).reshape(2,2,5)                                    
Out[255]: 
array([[[  1,   2,   3,   4,   5],
        [ 10,  20,  30,  40,  50]],

       [[ 15,  16,  17,  18,  19],
        [100, 200, 300, 400, 500]]])

, теперь используйте transpose, чтобы переместить это 5-мерное измерение в начало:

In [256]: np.array((a,b,c,d)).reshape(2,2,5).transpose(2,0,1)  

Таким образом, существуют разные способы объединения массивов и работы с измерениями. Я не думаю, что кто-то по своей природе проще. reshape и transpose дешевы, поэтому используйте их свободно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...