首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效的成对比较- Numpy 2D数组行

高效的成对比较- Numpy 2D数组行
EN

Stack Overflow用户
提问于 2018-10-07 17:15:44
回答 1查看 1.4K关注 0票数 2

我希望将Numpy 2D数组的每一行与所有其他行进行比较,并获得二进制矩阵的输出,这表明了每一对行的不匹配特性。

也许,作为一项投入:

代码语言:javascript
复制
 index col1 col2 col3 col4
   0    2    1    3    3
   1    2    3    3    4
   2    4    1    3    2

我想得到以下输出:

代码语言:javascript
复制
 index col1 col2 col3 col4  i  j
   0    0    1    0    1    0  1
   1    1    0    0    1    0  2
   2    1    1    0    1    1  2

作为'i‘和'j’保存比较行的原始索引。

实现这一点的最有效方法是什么?

由于"for“循环,我当前的实现耗时太长:

代码语言:javascript
复制
df = pd.DataFrame([[2,1,3,3],[2,3,3,4],[4,1,3,2]],columns=['A','B','C','D']) # example of a dataset
r = df.values
rows, cols = r.shape
additional_cols = ['i', 'j'] # original df indexes
allArrays = np.empty((0, cols + len(additional_cols)))

for i in range(0, rows):
        myArray = np.not_equal(r[i, :], r[i+1:, :]).astype(np.float32)
        myArray_with_idx = np.c_[myArray, np.repeat(i, rows-1-i), np.arange(i+1, rows)] # save original df indexes
        allArrays = np.concatenate((allArrays, myArray_with_idx), axis=0)
EN

回答 1

Stack Overflow用户

发布于 2018-10-07 17:28:15

方法#1 :这里有一个与np.triu_indices -

代码语言:javascript
复制
a = df.values
R,C = np.triu_indices(len(a),1)
out = np.concatenate((a[R] != a[C],R[:,None],C[:,None]),axis=1)

方法2 :我们也可以使用slicing和迭代填充-

代码语言:javascript
复制
a = df.values
n = a.shape[0]
N = n*(n-1)//2
idx = np.concatenate(( [0], np.arange(n-1,0,-1).cumsum() ))
start, stop = idx[:-1], idx[1:]
out = np.empty((N,a.shape[1]+2),dtype=a.dtype)
for j,i in enumerate(range(n-1)):
    s0,s1 = start[j],stop[j]
    out[s0:s1,:-2] = a[i,None] != a[i+1:]
    out[s0:s1,-2] = j
    out[s0:s1,-1] = np.arange(j+1,n)

out就是你的allArrays

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52690963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档