高效地使用索引列表填充NumPy数组

3

我知道如何在joblib中执行并行循环,返回一个列表作为结果。

但是,能否并行地填充预定义的numpy矩阵呢?

想象一下以下最简单的示例矩阵和数据:

column_data = ['a', 'b', 'c', 'd', 'e', 'f', 'x']
data = [['a', 'b', 'c'],
        ['d', 'c'],
        ['e', 'f', 'd', 'x']]
x = np.zeros((len(data), len(column_data))

请注意,column_data 是排序且唯一的。 data 是一个列表的列表,而不是一个矩形矩阵。
循环:
for row in range(len(data)):
    for column in data[row]:
        x[row][column_data.index(column)] = 1

这个循环是否可以并行化?填充一个 70,000 x 10,000 的矩阵如果没有并行化的话会非常慢。

1个回答

5

这里有一种几乎向量化的方法 -

lens = [len(item) for item in data]    
A = np.concatenate((column_data,np.concatenate(data)))
_,idx = np.unique(A,return_inverse=True)

R = np.repeat(np.arange(len(lens)),lens)
C = idx[len(column_data):]

out = np.zeros((len(data), len(column_data)))    
out[R,C] = 1

这里有另一个例子 -
lens = [len(item) for item in data]
R = np.repeat(np.arange(len(lens)),lens)
C = np.searchsorted(column_data,np.concatenate(data))

out = np.zeros((len(data), len(column_data)))
out[R,C] = 1

很抱歉造成了这种歧义。我改进了我的问题。data不是一个正方形矩阵,而是一个列表的列表。column_data已排序并且唯一。 - Tim
@Tim,我又添加了一个,请查看。 - Divakar
@Tim,另外,如果你运行了一些基准测试,你使用这些方法相比于循环方法获得了什么样的加速呢?我很好奇。 - Divakar
2
加速效果非常显著。对于一个39774 x 6461的矩阵,原始代码需要42.27秒,而您的代码仅需0.99秒 :) - Tim
@Tim 真是太好了!感谢你提供这些数字! - Divakar
显示剩余3条评论

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