【问题标题】:python - combination between elements of two matricespython - 两个矩阵的元素之间的组合
【发布时间】:2016-12-22 13:52:42
【问题描述】:

我有一个问题,我不知道如何描述它,所以你理解。 我将举一个例子。 假设我们在python中有这个数组(B):

[[ 1  1]
 [ 7 11]
 [1 20]
 [20 1]
 [26 11]
 [31 11]]

第一列代表用户。第二个标签。 现在,我想创建一个矩阵,该矩阵将具有“1s”,其中边缘存在,否则为“0s”。 我们分别有 5 个和 4 个不同的用户和标签,即 6*5 矩阵。 如果我写:

zero = np.zeros((6,5,).astype(int) #it needs one more row and column
for line in B:
 if line[2]:
    zero[line[0],line[1]] = 1

错误是:

   zero[line[0],line[1]] = 1

IndexError:索引 7 超出轴 0 的范围,大小为 7

好的,我怎样才能在两个矩阵之间进行组合,因为我希望元素“31”是第五行,元素“11”是第四列。

【问题讨论】:

  • 能否以矩阵格式显示所需的输出?
  • 矩阵为什么是6*5?
  • 你只有 3 个标签
  • 是的,你是对的!三个标签。我打错字了。
  • @angelk 如果您的问题通过答案得到解决,请接受答案。这将有助于其他最有效的方法。

标签: python algorithm numpy matrix


【解决方案1】:

使用 pandas 和 numpy

>>>import numpy as np
>>>import pandas as pd
>>> tagsArray = np.unique([1,11,20,1,11,11])
>>> userArray = np.unique([1,7,20,26,31])
>>> aa = [[ 1,1],[ 7, 11],[1, 20],[20, 1],[26, 11],[31, 11]]
>>> df = pd.DataFrame(index=userArray,columns=tagsArray)
>>> for s in aa:
...     df.loc[s[0],s[1]] = 1
...
>>> df.fillna(0,inplace=True)
>>> df
     1    11   20
1     1  NaN    1
7   NaN    1  NaN
20    1  NaN  NaN
26  NaN    1  NaN
31  NaN    1  NaN

【讨论】:

  • 还有df.fillna(0,inplace=True)
【解决方案2】:

与您最初的尝试保持一致,下面列出的是基于 NumPy 的方法。我们可以对这两列使用np.unique(..,return_inverse=1) 来为我们提供唯一的 ID,这些 ID 可以分别用作行和列索引,以对输出进行索引。此后,我们将简单地初始化输出数组并对其进行索引,从而为我们提供所需的结果。

因此,实现将是 -

r,c = [np.unique(i,return_inverse=1)[1] for i in B.T]
out = np.zeros((r.max()+1,c.max()+1),dtype=int)
out[r,c] = 1

另外,获取rc 的更明确的方法是这样 -

r = np.unique(B[:,0],return_inverse=1)[1]
c = np.unique(B[:,1],return_inverse=1)[1]

样本输入、输出-

In [27]: B  # Input array
Out[27]: 
array([[ 1,  1],
       [ 7, 11],
       [ 1, 20],
       [20,  1],
       [26, 11],
       [31, 11]])

In [28]: out  # Output
Out[28]: 
array([[1, 0, 1],
       [0, 1, 0],
       [1, 0, 0],    r = np.unique(B[:,0],return_inverse=1)[1]
c = np.unique(B[:,1],return_inverse=1)[1]
       [0, 1, 0],
       [0, 1, 0]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多