numpy — Сравнение двух элементов матрицы и заполнение относительного значения в другой позиции

#python #numpy #matrix

#python #numpy #матрица

Вопрос:

У меня есть матрица 12 x 12, в которой заполнены только первая строка и столбец. Приведенная ниже матрица,

 [['-' 'T' 'S' 'V' 'K' 'Y' 'A' 'F' 'H' 'L' 'P' 'Q']
['T' '' '' '' '' '' '' '' '' '' '' '']
['S' '' '' '' '' '' '' '' '' '' '' '']
['V' '' '' '' '' '' '' '' '' '' '' '']
['K' '' '' '' '' '' '' '' '' '' '' '']
['Y' '' '' '' '' '' '' '' '' '' '' '']
['A' '' '' '' '' '' '' '' '' '' '' '']
['F' '' '' '' '' '' '' '' '' '' '' '']
['H' '' '' '' '' '' '' '' '' '' '' '']
['L' '' '' '' '' '' '' '' '' '' '' '']
['P' '' '' '' '' '' '' '' '' '' '' '']
['Q' '' '' '' '' '' '' '' '' '' '' '']]
  

Что мне нужно сделать сейчас, это сравнить каждый элемент первой строки с каждым из первого столбца, чтобы увидеть, совпадают ли они или отличаются (например, TT, SS или SV, KS), игнорируя порядок букв (т. Е. SV следует считать таким же, как VS). Я пытаюсь использовать следующий цикл for,

 for x in np.nditer(matrix,op_flags=['readwrite'],op_dtypes=['str']):
  

Однако я не уверен, как получить доступ к каждому элементу с помощью цикла for и сравнить их с другим элементом в другой позиции. Кроме того, я не уверен, как записать результат этого сравнения в другую позицию в матрице. Я не очень хорошо знаком с numpy, но я рассмотрел вопросы, которые уже существуют, и, похоже, ни один из них мне не помогает. Возможно ли это сделать в numpy?

Заранее спасибо!

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

1. Я понял, что выполнение этого внутри матрицы немного сложнее и отнимает много времени. Итак, я в основном только что создал матрицу, заполненную нулями, объявил список с уникальными буквами, которые я хочу сравнить. Я выполнил два вложенных цикла for, чтобы сравнить индекс каждого элемента с любым другим элементом и выполнил операции над ним в зависимости от того, совпадает индекс или нет!

2. Итак, я последовал чему-то похожему на то, что предложил G M. Код выглядит следующим образом,

Ответ №1:

Я думаю, вы можете использовать просто python без использования numpy для этой работы вы можете получить доступ к массиву и записать его, просто используя обозначение a [подмассив] [индекс], как показано в решении:

 a=[['-','T','S','V','K','Y','A','F','H','L','P','Q'],
['T','','','','','','','','','','',''],
['S','','','','','','','','','','',''],
['V','','','','','','','','','','',''],
['K','','','','','','','','','','',''],
['Y','','','','','','','','','','',''],
['A','','','','','','','','','','',''],
['F','','','','','','','','','','',''],
['H','','','','','','','','','','',''],
['L','','','','','','','','','','',''],
['P','','','','','','','','','','',''],
['Q','','','','','','','','','','',''],]

def comparematrix(a):
    for i in a[0][1:]:#loop over the first row (note skip first element!)
        for j in range(1,len(a)):#loop over number of rows
            print a[j][0],i
            if a[j][0]==i:#find if they are equal
                    a[j][a[0].index(i)]='couple!'
            else:
                 a[j][a[0].index(i)]='%s,%s'%(a[j][0],i)
    return a
  

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

 [['-', 'T', 'S', 'V', 'K', 'Y', 'A', 'F', 'H', 'L', 'P', 'Q'],

['T', 'couple!', 'T,S', 'T,V', 'T,K', 'T,Y', 'T,A', 'T,F', 'T,H', 'T,L', 'T,P', 'T,Q'], 

['S', 'S,T', 'couple!', 'S,V', 'S,K', 'S,Y', 'S,A', 'S,F', 'S,H', 'S,L', 'S,P', 'S,Q'], 

['V', 'V,T', 'V,S', 'couple!', 'V,K', 'V,Y', 'V,A', 'V,F', 'V,H', 'V,L', 'V,P', 'V,Q'], 

['K', 'K,T', 'K,S', 'K,V', 'couple!', 'K,Y', 'K,A', 'K,F', 'K,H', 'K,L', 'K,P', 'K,Q'], 

['Y', 'Y,T', 'Y,S', 'Y,V', 'Y,K', 'couple!', 'Y,A', 'Y,F', 'Y,H', 'Y,L', 'Y,P', 'Y,Q'], 

['A', 'A,T', 'A,S', 'A,V', 'A,K', 'A,Y', 'couple!', 'A,F', 'A,H', 'A,L', 'A,P', 'A,Q'], 

['F', 'F,T', 'F,S', 'F,V', 'F,K', 'F,Y', 'F,A', 'couple!', 'F,H', 'F,L', 'F,P', 'F,Q'], 

['H', 'H,T', 'H,S', 'H,V', 'H,K', 'H,Y', 'H,A', 'H,F', 'couple!', 'H,L', 'H,P', 'H,Q'], 

['L', 'L,T', 'L,S', 'L,V', 'L,K', 'L,Y', 'L,A', 'L,F', 'L,H', 'couple!', 'L,P', 'L,Q'], 

['P', 'P,T', 'P,S', 'P,V', 'P,K', 'P,Y', 'P,A', 'P,F', 'P,H', 'P,L', 'couple!', 'P,Q'], 

['Q', 'Q,T', 'Q,S', 'Q,V', 'Q,K', 'Q,Y', 'Q,A', 'Q,F', 'Q,H', 'Q,L', 'Q,P', 'couple!']]
  

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

1. Спасибо! Я использовал аналогичный подход и смог получить то, что я хочу, без numpy 🙂

Ответ №2:

Вот так. Если я вас правильно понял:

 >>> import numpy as np
>>>
>>> a = np.array([[1,2,3,4],[4,6,7,8],[3,10,11,12],[1,13,14,15]])
>>> a
array([[ 1,  2,  3,  4],
       [ 4,  6,  7,  8],
       [ 3, 10, 11, 12],
       [ 1, 13, 14, 15]])
>>> b = a[0]
>>> b
array([1, 2, 3, 4])
>>> a.transpose()[0]
array([1, 4, 3, 1])
>>> c = a.transpose()[0]
>>> c
array([1, 4, 3, 1])
>>> for x in b:
...     for y in c:
...             if x == y:
...                     print "Do this if y=%d is equal to x=%d"%(y,x)
...             else:
...                     print "Do that if y=%d is not equal to x=%d"%(y,x)
...
Do this if y=1 is equal to x=1
Do that if y=4 is not equal to x=1
Do that if y=3 is not equal to x=1
Do this if y=1 is equal to x=1
Do that if y=1 is not equal to x=2
Do that if y=4 is not equal to x=2
Do that if y=3 is not equal to x=2
Do that if y=1 is not equal to x=2
Do that if y=1 is not equal to x=3
Do that if y=4 is not equal to x=3
Do this if y=3 is equal to x=3
Do that if y=1 is not equal to x=3
Do that if y=1 is not equal to x=4
Do this if y=4 is equal to x=4
Do that if y=3 is not equal to x=4
Do that if y=1 is not equal to x=4
  

Что я делаю, так это беру первую строку из заданной матрицы, b = a[0] затем транспонирую исходную матрицу и беру первую строку из результата c = a.transpose()[0] , что в основном означает, что я просто взял первый столбец исходной матрицы. Таким образом, у вас есть элементы массива b с первой строкой и c с элементами первого столбца. Теперь вы можете делать с ними все, что захотите. Вот что я сделал: для каждого элемента в b найдите его в c и распечатайте, если он найден

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

1. Здравствуйте, этот код был бы идеальным, если бы я хотел проверить, присутствует ли определенный элемент в столбце или нет. Однако то, что я хотел сделать, это сравнить каждый элемент первой строки с любым другим элементом первого столбца и выполнить операции над ними в зависимости от того, совпадают они или нет. Я действительно ценю ответ, хотя я также узнал о функции транспонирования из вашего ответа. Спасибо, что нашли время 🙂

2. Привет. Я обновил свой ответ, чтобы соответствовать вашим требованиям, насколько я их понимаю. Пожалуйста, предоставьте ваше решение с кодом (я видел ваш комментарий к исходному вопросу), используя Answer Your Question button, я не уверен, но похоже, что код, который вы описали, может быть неправильным в большинстве случаев.

Ответ №3:

Итак, я последовал чему-то похожему на то, что предложил G M. Код выглядит следующим образом,

 def freq_pair(output_pa):
# Creating matrix using the list with 12 rows and 12 columns
aa = ['T','S','V','K','Y','A','F','H','L','P','Q']

nrows = len(aa)
ncols = len(aa)
#print nrows,ncols

matrix = np.zeros((nrows,ncols))      
print(matrix)

#Looping through the matrix to change the value to frequency of occurence
for item in aa:
    for itemB in aa:
        if aa.index(item) != aa.index(itemB):
            eab = float((output_pa[item][1])) * float((output_pa[itemB][1]))*2
        else:
            eab = float((output_pa[item][1])) * float((output_pa[itemB][1]))

            #print(eab)
        matrix[aa.index(item), aa.index(itemB)] = eab
return matrix
  

output_pa — это словарь с буквами в качестве ключевых и их частотой и frequency / total frequency в качестве значений. По сути, это дало мне желаемый результат за гораздо меньшее время, чем что-либо другое!