Транспонируйте только значения матрицы с помощью numpy, если они кратны 3

#python #python-3.x #numpy #matrix #transpose

Вопрос:

У меня есть матрица 5×5, и я хотел бы перенести все значения, кроме тех, которые кратны 3, они будут перенесены со следующей структурой:

Если кратно 3: M[i, j] = (3 * j i)**2 В противном случае: M[i, j] = M[j, i]

M это матрица i и j индекс строк и столбцов.

Матрица состоит из 25 значений от 1 до 100 без повторения.

У меня есть следующий код, и теперь я создал условие для значений, кратных 3. Я не знаю, как создать ту часть, где это должно быть сделано:

 M[i, j] = (3 * j   i)**2  

Я поставил 0 в результате, просто чтобы показать места, где (3 * j i)**2 они должны появиться.

 import numpy as np M = np.random.randint(1, 100, size=25).reshape(5, 5) print("Matrix 5x5 original") print(M) print("Matrix transposed") M = np.transpose(M) M[M % 3 == 0] = 0 print(M)  

введите описание изображения здесь

Комментарии:

1. Этот код неполон. И еще я этого не понимаю. i будет целый ряд M . np.transpose(M) переносит все это; зачем делать это неоднократно? И i%3==0 обязательно вызовет ошибку двусмысленности в if выражении.

2. Привет, hpaulj, да, я-строка, а j-столбец. Идея состоит в том, что матрица транспонирует все, но те, которые кратны 3, они покажут результат M[i,j]=(3*j i)**2

3. Это немного не связано, но вы сказали в своем посте, что цифры должны быть без повторения. С np.random.randint этим ничего не гарантировано. Если «без повторения» является обязательным, вы должны использовать np.random.choice(100, size=25, replace=False) .

4. Большое спасибо Сэмс-студии. Вы абсолютно правы!

Ответ №1:

Вам нужно преобразовать маску M % 3 == 0 в индексы. Что — то вроде этого должно сработать:

 M = M.T i, j = np.where(M % 3 == 0) M[i, j] = (3 * j   i)**2  

Комментарии:

1. Я думаю, тебе нужно np.where(M % 3 == 0) .

2. @sams-студия. Вы правы. Исправлено