使用索引列表高效地填充 NumPy 数组
Efficiently filling NumPy array using lists of indices
我知道如何在 joblib
中执行并行循环,结果 returns 一个列表。
但是,是否可以并行填充预定义的 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
矩阵非常慢。
这是一个几乎矢量化的方法-
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
我知道如何在 joblib
中执行并行循环,结果 returns 一个列表。
但是,是否可以并行填充预定义的 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
矩阵非常慢。
这是一个几乎矢量化的方法-
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