#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-студия. Вы правы. Исправлено