【发布时间】:2021-10-10 19:40:00
【问题描述】:
我有一些将数据映射到矩阵的代码...大部分都是设置,以便可以轻松重现我的问题,但我需要加快的唯一部分是评论 # the part I want to speed up 之后的内容。
import numpy as np
# config
matrix_height = 100
matrix_width = 200
# fake data
x_data = np.array(range(10000))
y_data = [{i:i for i in range(100)} for t in range(len(x_data))]
# fake mapping
x_to_index = {x: np.random.randint(matrix_width) for x in x_data }
y_to_index = {}
for y_dict in y_data:
for y_key, y_val in y_dict.items():
y_start = np.random.randint(matrix_height-2)
y_to_index[y_key] = (y_start, y_start+2 )
# data that must be stored
total_matrix = np.zeros([matrix_height, matrix_width]).astype(int)
n_matrix = np.zeros([matrix_height, matrix_width]).astype(int)
latest_value = np.zeros([matrix_height, matrix_width]).astype(int)
# the part I want to speed up
for x, y_dict in zip(x_data, y_data):
x_index = x_to_index[x]
for y_key, y_data in y_dict.items():
y_slice = slice(*y_to_index[y_key])
total_matrix[ y_slice, x_index ] += y_data
latest_value[ y_slice, x_index ] = y_data
n_matrix[ y_slice, x_index ] += 1
同样,我只关心# the part I want to speed up评论下方的部分。
我不确定如何加快速度,但似乎应该可以使用可以并行执行所有这些操作的映射函数...
我正在寻找最后一部分的显着改进。有什么想法吗?
【问题讨论】:
-
假映射部分中的 y_to_index 列表是否正确?即使它迭代了10000次,也只保存了最后一次迭代?澄清将有助于推断最后部分的意图。
-
@Frank 它不会更新第一次迭代之后的数字,所以如果你愿意,你可以
break。关键是对矩阵高度范围内的每个键都有一个映射。我很高兴澄清,如果需要更多澄清,请告诉我! -
y_data是否始终包含 dict 将所有键从 0 到最大值(即此处为 100)?x_to_index和y_to_index是这种情况吗(即此处分别为 0..10000 和 0..100)? -
@JérômeRichard 第一个索引和最后一个索引将至少有一个映射到它(按设计)
-
我想我找到了一个提示,当我得到它的工作时会发布解决方案stackoverflow.com/questions/7894791/…
标签: python numpy mapping big-o