Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-两个矩阵元素之间的组合_Python_Algorithm_Numpy_Matrix - Fatal编程技术网

python-两个矩阵元素之间的组合

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

我有一个问题,我不知道如何描述它,所以你能理解。 我将举一个例子。 假设我们有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 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)