Как проиндексировать всю матрицу из блока с помощью Python - PullRequest
1 голос
/ 26 сентября 2019

Я пытаюсь итеративно создать блочную матрицу внутри цикла for в python.Есть ли способ использовать простую индексацию, в которой индекс соответствует матричному индексу вместо скалярного индекса.Например, представьте следующее как две матрицы 2x2 в блочной матрице:

4 5 6 7
1 2 3 4

Есть ли способ индексировать подматрицы так, чтобы:

block_matrix[0,0] = 
4 5
1 2

block_matrix[0,1] = 
6 7
3 4

Моя конечная цельиметь цикл for, чтобы сложить их.Например:

for i in range(3):
   for j in range(3):
      mat = single_matrix
      block_matrix[i,j] = mat

block_matrix =

matrix_1_1 matrix_1_2 matrix_1_3
matrix_2_1 matrix_2_2 matrix_2_3
matrix_3_1 matrix_3_2 matrix_3_3

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Использование numpy с нарезкой было бы хорошим способом.

import numpy as np
block_matrix = np.zeros((9,9))  # shape (9,9)
mat = np.reshape(np.arange(9), (3,3))  # shape (3,3)

for i in range(3):
   for j in range(3):
      block_matrix[i*3:i*3+3,j*3:j*3+3] = mat

# block_matrix = 
#         mat mat mat 
#         mat mat mat 
#         mat mat mat 

Там, конечно, я только что создал простую матрицу формы (3,3) ииспользовал его для всех частей block_matrix, но я надеюсь, что вы понимаете суть.

0 голосов
/ 26 сентября 2019

Я считаю, что вам нужны следующие функции: numpy.reshape и numpy.swapaxes

https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html https://docs.scipy.org/doc/numpy/reference/generated/numpy.swapaxes.html

import numpy as np
a = np.array([[4,5,6,7],[1,2,3,4]])
b = np.reshape(a, (2,2,2), order="C")
c = np.swapaxes(b, 0, 1)
print(c)

Вывод:

[[[4 5]
  [1 2]]

 [[6 7]
  [3 4]]]

Редактировать

Вот версия, которая должна работать для вашего случая, включая то, что делает цикл:

import numpy as np
a = np.random.random((6,6))
b = np.reshape(a, (3,2,3,2), order="C")
c = np.swapaxes(b, 2, 1)
print(a)
print(c[0,1])

Вывод:

[[0.14413028 0.32553884 0.84321485 0.52101265 0.39548678 0.04210311]
 [0.06844168 0.37270808 0.0523836  0.66408026 0.29857363 0.9086674 ]
 [0.30052066 0.85342026 0.42354871 0.20516629 0.47962509 0.31865669]
 [0.92307636 0.36024872 0.00109126 0.66277798 0.70634145 0.02647658]
 [0.18408546 0.79832633 0.92462421 0.8060224  0.51464245 0.88324207]
 [0.24439081 0.61620587 0.66114919 0.50045374 0.93085541 0.85732735]]
[[0.84321485 0.52101265]
 [0.0523836  0.66408026]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...