python中关于矩阵相互转换的代码实现

现在有个关于m个对象,并且每个对象有n个属性的矩阵mxn(如下图)

img

现在要把这个矩阵转化成两两比较矩阵,也就是说依次选择两个对象进行属性比较(如下图)

img

,比较方式就是让两个对象属性值相减。得到新的矩阵。

想询问相关问题需要调用哪些库,并请给出相关问题的代码

用numpy,应该不难吧?简单写了一个demo,供题主参考。实话实话,这样的问题不值得悬赏50块钱。

>>> import numpy as np
>>> def func(dmat):
    m, n = dmat.shape
    result = np.array([])
    for i in range(m-1):
        result = np.append(result, dmat[0] - dmat[i+1:])
    return result.reshape(-1, n)

>>> data = np.random.random((4,3))
>>> data
array([[0.36279939, 0.38509106, 0.49963333],
       [0.0694777 , 0.69383702, 0.13091123],
       [0.2055876 , 0.53550328, 0.6447773 ],
       [0.49737748, 0.27863575, 0.1494784 ]])
>>> func(data)
array([[ 0.29332169, -0.30874596,  0.3687221 ],
       [ 0.15721179, -0.15041222, -0.14514397],
       [-0.13457809,  0.1064553 ,  0.35015494],
       [ 0.15721179, -0.15041222, -0.14514397],
       [-0.13457809,  0.1064553 ,  0.35015494],
       [-0.13457809,  0.1064553 ,  0.35015494]])

完整代码私信发你了

import itertools
itertools.combinations(list,r=2) #无放回的组合
那么你把所有对象放到一个list里,就可以得到两两对象组合的一个集合
属性的话,反正是一一对应的,对象有了属性就好办了

这是一个笛卡尔积问题,可以采用以下示例代码:

import pandas as pd

A1 = pd.DataFrame({'A1': (1, 2, 3), 'B1': (3, 4, 5), 'C1': (3, 4, 10), 'key': 1})
A2 = pd.DataFrame({'A2': (1, 2, 3), 'B2': (3, 4, 5), 'C2': (3, 4, 10), 'key': 1})
AA = pd.merge(A1, A2, on='key')
print(AA)

AA.eval("""
ab11 = A1 - A2
ab22 = B1 - B2
ab33 = C1 - C2""", inplace=True)

print(AA)

运行结果如下:

 A1  B1  C1  key  A2  B2  C2
0   1   3   3    1   1   3   3
1   1   3   3    1   2   4   4
2   1   3   3    1   3   5  10
3   2   4   4    1   1   3   3
4   2   4   4    1   2   4   4
5   2   4   4    1   3   5  10
6   3   5  10    1   1   3   3
7   3   5  10    1   2   4   4
8   3   5  10    1   3   5  10
   A1  B1  C1  key  A2  B2  C2  ab11  ab22  ab33
0   1   3   3    1   1   3   3     0     0     0
1   1   3   3    1   2   4   4    -1    -1    -1
2   1   3   3    1   3   5  10    -2    -2    -7
3   2   4   4    1   1   3   3     1     1     1
4   2   4   4    1   2   4   4     0     0     0
5   2   4   4    1   3   5  10    -1    -1    -6
6   3   5  10    1   1   3   3     2     2     7
7   3   5  10    1   2   4   4     1     1     6
8   3   5  10    1   3   5  10     0     0     0

Process finished with exit code 0

若有帮助,谢谢采纳~

最简单写循环,每次做一次减法,下面假定你的m个矩阵按照列表存在As,可以用As[i]索引

result = []
for i in range(m-1):
  for j in range(i+1,m):
    result.append(As[i]-As[j])
print(np.concatenate(result))

# -*- coding: utf-8 -*-
import random


def init(m,n):
    '''
    初始化矩阵
    :param m:
    :param n:
    :return:
    '''
    mxn={}
    for i in range(0,m):
        item = "A{}".format(i+1)
        item_map={}
        for j in range(0,n):
            prop=u"属性{}".format(j+1)
            item_map[prop] = random.randint(0,100)
        mxn[item] = item_map
    return mxn


def transform(mxn, m, n):
    '''
    转换数组
    :param mxn:矩阵对象
    :param m: 记录数
    :param n: 属性数
    :return:
    '''
    result = {}
    for i in range(0, m - 1):
        for j in range(i+1,m):
            key = "A{}-A{}".format(i + 1,j + 1)
            item_map = {}
            for k in range(0,n):
                prop = u"属性{}两两比较".format(k + 1)
                key1= "A{}".format(i + 1)
                key2= "A{}".format(j + 1)
                sub_prop = u"属性{}".format(k+1)
                value = mxn[key1][sub_prop] - mxn[key2][sub_prop]
                item_map[prop] = value
            result[key] = item_map
    return result


if __name__ == "__main__":
    mxn = init(4, 3)
    print(mxn)

    result = transform(mxn, 4, 3)
    print(result)

img


自定义函数,没有使用库,如有帮助,请采纳