gpt4 book ai didi

python - 当元组中每个位置的值来自不同的列表时,从元组序列创建值的索引数组

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

这很难解释,但我有一个元组列表,其中每个元组的长度为 n,每个元组中项目的可能值都包含在一组列表中(元组中的每个位置一个列表)。
为了一个简单的例子,我的元组列表可能是

sequence = [('b', 1), ('c', 2), ('c', 1), ('a', 3), ('c', 2), ('a', 3)]
可能的值列表是:
state_lists = [['a', 'b', 'c'], [1, 2, 3, 4]]
我想要一种有效的方法来创建类似于 sequence 的列表或数组(首选整数数组)但是每个值都由来自 state_lists 的相应列表中的索引替换.
这是一种利用 np.searchsorted 的解决方案.不幸的是,这个函数只支持一维数组:
import numpy as np
sequence_as_array = np.array(sequence)
sequence_indexes = [
np.searchsorted(states, sequence_as_array[:, i])
for i, states in enumerate(state_lists)
]
lookup_array = np.vstack(sequence_indexes).T
print(lookup_array)

[[1 0]
[2 1]
[2 0]
[0 2]
[2 1]
[0 2]]
有没有更简单的方法来做到这一点(例如,没有 for 循环,将 sequence 转换为数组并避免使用 vstack )?
它必须是一个通用的解决方案,因为元组的长度可能超过 2,并且数据类型可能是 float、int 或 string。
替换值的原因是创建一个查找数组,用于快速索引和比存储原始值更少的内存。 sequence的长度可能超过10,000。

最佳答案

一种有效的方法是使用 pandas 中对分类序列的内置支持:

import pandas as pd
sequence = [('b', 1), ('c', 2), ('c', 1), ('a', 3), ('c', 2), ('a', 3)]
df = pd.DataFrame(sequence, dtype='category')

print(df[0].cat.categories.to_numpy())
# ['a', 'b', 'c']

print(df[0].cat.codes.to_numpy())
# [1 2 2 0 2 0]
Pandas 为这类事情提供了相当优化的代码路径,您可以将其用于您的用例,而无需自己重新实现它们。

关于python - 当元组中每个位置的值来自不同的列表时,从元组序列创建值的索引数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65785455/

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