现在要把这个矩阵转化成两两比较矩阵,也就是说依次选择两个对象进行属性比较(如下图)
想询问相关问题需要调用哪些库,并请给出相关问题的代码
用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)