我该如何基于另一个数组创建一个数组?

5

我是新手,想尝试基于另一个数组创建数组。

如果我有一个数组:

array = [[1, 1], [1, 2], [2, 2], [3, 2], [3, 3], [4, 2], [5, 1], [5, 3]]

如果想要基于数组创建矩阵,可以按照对应位置的值进行创建,例如: 在数组中,第一个数字表示矩阵的行数,第二个数字表示矩阵的列数,如 [1, 1] 表示行1 列1有值为1;如果数组中不存在 [1, 3],则表示行1 列3的值为0。因此,我希望结果如下:

      col1 col2 col3
row1 [ 1    1    0 ]
row2 [ 0    1    0 ]
row3 [ 0    1    1 ]
row4 [ 0    1    0 ]
row5 [ 1    0    1 ]

result = [[1, 1, 0], [0, 1, 0], [0, 1, 1], [0, 1, 0], [1, 0, 1]]

请注意,数组中的值仅是示例,而不是矩阵的确切位置。

我已经尝试将值插入空数组,但在矩阵中很难确定相应的位置。

另一个例子是:

array =[[4, 3], [4, 23], [5, 308], [5, 432], [8, 432], [8, 429]]

矩阵会像这样:

      col1 col2 col3 col4 col5
row1 [ 1    1    0    0    0  ]
row2 [ 0    0    1    1    0  ]
row3 [ 0    0    0    1    1  ]

不确定问题描述是否清晰明了。

3个回答

4

第一个数组(命名为array)称为稀疏二进制矩阵表示。第二个数组(命名为result)称为密集二进制矩阵表示。如果您想先将值转换为排名(同时保留重复项),可以使用numpy.unique函数。因此,完整的过程如下:

from scipy.sparse import csr_matrix
from numpy import unique

array = [[1, 1], [1, 2], [2, 2], [3, 2], [3, 3], [4, 2], [5, 1], [5, 3]]

r_unique, rows = unique([v[0] for v in array], return_inverse=True)
c_unique, cols = unique([v[1] for v in array], return_inverse=True)
values = [1] * len(array)
n = len(r_unique)
m = len(c_unique)

result = csr_matrix((values, (rows, cols)), shape=(n, m)).toarray()

这个方法可行是因为r_uniquearray中一个维度上所有唯一数字的集合,这个集合的大小就是在相应维度上result的尺寸。接着,rows 包含了从 number 到其在该维度内的rank的映射。同样地,colsc_unique 也对应地实现了这种映射。

1
非常感谢!!这正是我想要的。非常感激:)))) - Tina Chiu
@TinaChiu 当然,给我几分钟。 - Captain Trojan
1
@TinaChiu 请看一下。 - Captain Trojan
以这种方式它工作得很好。非常感谢,@Captain Trojan :))) - Tina Chiu
不客气 @TinaChiu,但事实上,如果答案真的对你有帮助,我会很感激你能接受它 c: - Captain Trojan
显示剩余5条评论

1
你可以很容易地使用numpy来完成这个任务。
rows,columns = numpy.array(list(zip(*array)))
matrix_size = (6,6)
result = numpy.zeros(matrix_size)
result[(rows,columns)] = 1
print(result)

如果您的数组值是从1开始的,那么您需要将它们改为从0开始...只需更改即可。
result[(rows-1,columns-1)] = 1 # now we are 0 based instead of 1 based

1
无需使用库的解决方案:
data_list = [[1, 1], [1, 2], [2, 2], [3, 2], [3, 3], [4, 2], [5, 1], [5, 3]]

rows_ = (max(data_list, key = lambda x : x[0] ))[0]
cols_ = (max(data_list, key = lambda x : x[1] ))[1]

matrix =  [ [0]*cols_ for r in range(rows_) ]


for data in data_list:
    row_index = data[0] - 1
    col_index = data[1] - 1
    matrix[row_index][col_index] = 1

for matrix_row in matrix:
    print(matrix_row)

Reuslt:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接