gpt4 book ai didi

python - 两个大向量之间的逐元素比较,稀疏度高

转载 作者:行者123 更新时间:2023-12-04 14:59:01 25 4
gpt4 key购买 nike

需要一个与 numpy.where 函数执行类似的函数,但不会遇到由 bool 数组的密集表示引起的内存问题。因此,该函数应该能够返回一个极其稀疏的 bool 数组。

虽然下面给出的示例适用于小型数据集/向量,但一旦 my_sample 是 - 例如 - 形状,就不可能使用 numpy.where 函数(10.000.000, 1)my_population 的形状为 (100.000, 1)。阅读其他线程后,numpy.where 在评估表达式 numpy.where((my_sample) == my_population.T))。这个密集的 (10.000.000, 100.000) 数组无法放入我的机器/大多数机器的内存中。

生成的数组非常稀疏。在我的例子中,知道每行最多有两个 1!使用上面的规范,稀疏度等于 0.002%。这绝对应该适合内存。

尝试为数值模拟创建类似于模型/设计矩阵的东西。生成的矩阵将用于一些线性代数运算。

最小工作示例:请注意向量中的位置/坐标很重要。

# import packages
import numpy as np

# my_sample is the vector of observations
my_sample = ['a', 'b', 'c', 'a']

# my_population is the lookup vector
my_population = ['a', 'b', 'c']

# initalise the matrix (dense matrix for this exampe)
my_zero = np.zeros((len(my_sample), len(my_population)))

# reshape to arrays
my_sample = np.array(my_sample).reshape(-1, 1)
my_population = np.array((my_population)).reshape(-1, 1)

# THIS STEP CAUSES THE MEMORY ISSUES
my_indices = np.where((my_sample == my_population.T))

# set the matches to equal one
my_zero[my_indices] = 1

# show matrix
my_zero
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.],
[1., 0., 0.]])

最佳答案

首先,让我们将其编码为整数,而不是字符串。字符串很糟糕。

pop_levels, pop_idx = np.unique(my_population, return_inverse=True)
sample_levels, sample_idx = np.unique(my_sample, return_inverse=True)

重要的是 pop_levelssample_levels 是相同的,但如果它们是相同的,那么您就大功告成了 - 将它们打包到稀疏掩码中:

sample_mask = sps.csr_matrix((np.ones_like(sample_idx), sample_idx, range(len(sample_idx) + 1)))

我们完成了:

>>> sample_mask.A
array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1],
[1, 0, 0]])

您可能需要重新排序您的因子水平,以便它们在您的样本和总体之间相同,但只要您可以统一这些标签,这只需矩阵分配就可以非常简单地完成。

关于python - 两个大向量之间的逐元素比较,稀疏度高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67335744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com