gpt4 book ai didi

python - Numpy:是否可以使用 numpy 和 ndarray 来替换此代码段中的循环?

转载 作者:太空狗 更新时间:2023-10-30 02:49:46 28 4
gpt4 key购买 nike

我正在寻找更智能、更好的解决方案。

我想根据标签内容对数字字段应用不同的比例因子。希望以下代码可以说明我正在努力实现的目标:

PS = [('A', 'LABEL1', 20),
('B', 'LABEL2', 15),
('C', 'LABEL3', 120),
('D', 'LABEL1', 3),]

FACTOR = [('LABEL1', 0.1), ('LABEL2', 0.5), ('LABEL3', 10)]

d_factor = dict(FACTOR)

for p in PS:
newp = (p[0], p[1], p[2]*d_factor[p[1]])
print newp

这是一个非常微不足道的操作,但我需要在至少一百万行的数据集上执行它。

当然,越快越好。

这些因素是事先知道的,数量上不会超过20到30。

  1. 有没有我们可以使用的矩阵或 linalg 技巧?

  2. ndarray 可以接受单元格中的文本值吗?

最佳答案

如果您想混合数据类型,您需要 structured arrays .

如果您想要查找数组中匹配值的索引,您需要 searchsorted

你的例子是这样的:

>>> import numpy as np
>>> PS = np.array([
('A', 'LABEL1', 20),
('B', 'LABEL2', 15),
('C', 'LABEL3', 120),
('D', 'LABEL1', 3),], dtype=('a1,a6,i4'))
>>> FACTOR = np.array([
('LABEL1', 0.1),
('LABEL2', 0.5),
('LABEL3', 10)],dtype=('a6,f4'))

你的结构化数组:

>>> PS
array([('A', 'LABEL1', 20), ('B', 'LABEL2', 15), ('C', 'LABEL3', 120),
('D', 'LABEL1', 3)],
dtype=[('f0', '|S1'), ('f1', '|S6'), ('f2', '<i4')])
>>> FACTOR
array([('LABEL1', 0.10000000149011612), ('LABEL2', 0.5), ('LABEL3', 10.0)],
dtype=[('f0', '|S6'), ('f1', '<f4')])

您可以像这样访问各个字段(或者您可以给它们命名;请参阅文档):

>>> FACTOR['f0']
array(['LABEL1', 'LABEL2', 'LABEL3'],
dtype='|S6')

如何在PS上进行FACTOR的查找(FACTOR必须排序):

>>> idx = np.searchsorted(FACTOR['f0'], PS['f1'])
>>> idx
array([0, 1, 2, 0])
>>> FACTOR['f1'][idx]
array([ 0.1, 0.5, 10. , 0.1], dtype=float32)

现在只需创建一个新数组并相乘:

>>> newp = PS.copy()
>>> newp['f2'] *= FACTOR['f1'][idx]
>>> newp
array([('A', 'LABEL1', 2), ('B', 'LABEL2', 7), ('C', 'LABEL3', 1200),
('D', 'LABEL1', 0)],
dtype=[('f0', '|S1'), ('f1', '|S6'), ('f2', '<i4')])

关于python - Numpy:是否可以使用 numpy 和 ndarray 来替换此代码段中的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6756616/

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