Перебор верхней треугольной матрицы в Python

#python

Вопрос:

Я использую Python, и у меня есть матрица XxY, где X = Y, и я хочу выполнить итерацию по верхней треугольной матрице определенным образом, чтобы она начиналась с введите описание изображения здесьи продолжалась, введите описание изображения здесьи введите описание изображения здесьи так далее, и так далее до последней строки и столбца. Поэтому я попытался создать двойной цикл, который перебирает столбцы один за другим, и внутри этого цикла я создал еще один цикл, который перебирает строки, всегда добавляя одну строку. Однако я застрял в определении того, как добавить следующую строку для каждого столбца во втором цикле. Вот что я получил до сих пор (для простоты я просто создал массив нулей):

 import pandas as pd
import numpy as np

# number of columns
X = 10
# number or rows
Y = X

U = np.zeros((Y,X))

for j in range(X):
    for z in range():
 

Моя первоначальная идея состояла в том, чтобы создать массив Yx1 с y = np.asarray(list(range(0,Y))) помощью и использовать его для второго цикла, но я не понимаю, как это реализовать. Может кто-нибудь, пожалуйста, помочь мне? Может быть, есть более простой способ определить такую итерацию?

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

1. for z in range(j, X 1): ... (включены диагональные элементы)

Ответ №1:

С помощью Numpy вы можете получить индексы для верхней треугольной матрицы с triu_indices_from помощью и индексировать в массив с помощью этого:

 import numpy as np

a = np.arange(16).reshape([4, 4])
print(a)
#[[ 0  1  2  3]
# [ 4  5  6  7]
# [ 8  9 10 11]
# [12 13 14 15]]

indices = np.triu_indices_from(a)

upper = a[indices]
print(upper)
# [ 0  1  2  3  5  6  7 10 11 15]
 

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

1. Спасибо за информацию! Разве это не перезаписало бы значения в матрице? Я просто взял нули здесь для простоты, но на самом деле у меня есть матрица с определенными значениями.

2. Не уверен, что я понимаю @Phil, ничего в приведенном выше коде не меняется a . Индексы — это новый массив индексов, который вы используете для индексации a . upper это новый массив, основанный на этой индексации. a остается неизменным повсюду.

3. Извините, я неправильно понял ваш код, так как думал, что a — это моя исходная матрица U, а не новая!

4. Если я хочу сохранить размер переменной матрицы, как бы я написал это так, чтобы оно сохраняло текущие целые числа? Я пробовал с np.array помощью and np.arange , но не смог его найти.