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

2024-10-03 11:13:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我在寻找一个更聪明更好的解决方案。在

我想根据标签内容对数字字段应用不同的缩放因子。希望下面的代码可以说明我要实现的目标:

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. 有什么矩阵或利纳格的把戏可以用吗?

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


Tags: 代码内容目标数字标签解决方案dict因子
3条回答

如果您想混合数据类型,您需要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'))

您的结构化阵列:

^{pr2}$

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

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

如何在PS上查找因子(因子必须排序):

>>> 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')])

如果比较两个numpy数组,就会得到相应的索引。您可以使用这些索引来执行集合操作。这可能不是最快的修改,但它简单明了。如果PS需要您显示的结构,可以使用自定义dtype并使用Nx3数组。在

import numpy as np

col1 = np.array(['a', 'b', 'c', 'd'])
col2 = np.array(['1', '2', '3', '1'])
col3 = np.array([20., 15., 120., 3.])

factors = {'1': 0.1, '2': 0.5, '3': 10, }

for label, fac in  factors.iteritems():
    col3[col2==label] *= fac

print col3

我觉得纽比帮不了你。顺便说一句,它是ndarray,不是nparray。。。在

也许你可以用发电机。见http://www.dabeaz.com/generators/index.html

相关问题 更多 >