python-两个矩阵元素之间的组合
我有一个问题,我不知道如何描述它,所以你能理解。 我将举一个例子。 假设我们有python中的数组(B):python-两个矩阵元素之间的组合,python,algorithm,numpy,matrix,Python,Algorithm,Numpy,Matrix,我有一个问题,我不知道如何描述它,所以你能理解。 我将举一个例子。 假设我们有python中的数组(B): [[ 1 1] [ 7 11] [1 20] [20 1] [26 11] [31 11]] 第一列表示用户。第二个是标签。 现在,我想创建一个矩阵,它的边为“1”,否则为“0”。 我们分别有5个和4个不同的用户和标签,这是一个6*5矩阵。。 如果我写: zero = np.zeros((6,5,).astype(int) #it needs one more row and
[[ 1 1]
[ 7 11]
[1 20]
[20 1]
[26 11]
[31 11]]
第一列表示用户。第二个是标签。
现在,我想创建一个矩阵,它的边为“1”,否则为“0”。
我们分别有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
索引器:索引7超出大小为7的轴0的界限
好的,因为我希望元素“31”是第五行,元素“11”是第四列,所以如何在两个矩阵之间进行组合。使用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
接近您最初的尝试,下面列出的是一种基于NumPy的方法。我们可以使用这两列来为我们提供唯一的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
或者,获取r
和c
的更明确的方法如下-
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]])
你能以矩阵格式显示所需的输出吗?为什么矩阵是6*5?你只有3个阶段你是对的!三个标签。我犯了一个打字错误。@angelk如果你的问题被答案解决了,请接受答案。这将有助于其他最有效的方法。并且
df.fillna(0,inplace=True)
。