gpt4 book ai didi

python - 根据相关结构选择python结构中的记录

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:21 26 4
gpt4 key购买 nike

在我的实际问题中,我将有两个信息表 (x,y)。 x 将有 260 万条记录,y 将有 10K 条记录;这两个表具有多对一 (x->y) 关系。我想根据 y 对 x 进行子集化。

我认为最匹配的帖子是 thisthat还有this .我选择了 numpy 数组。我愿意使用其他数据结构;我只是想挑选一些可以扩展的东西。我使用的方法是否合适?还有其他帖子涵盖这个吗?我不想使用数据库,因为我只用了一次。

下面的代码试图说明我正在尝试做什么。

import numpy, copy
x=numpy.array([(1,'a'), (1, 'b'), (3,'a'), (3, 'b'), (3, 'c'), (4, 'd')], dtype=[('id', int),('category', str, 22)] )
y=numpy.array([('a', 3.2, 0), ('b', -1, 0), ('c', 0, 0), ('d', 100, 0)], dtype=[('category', str, 20), ('value', float), ('output', int)] )
for id, category in x:
if y[y['category']==category]['value'][0] > 3:
y[y['category']==category]['output']=numpy.array(copy.deepcopy(id))

最佳答案

当您尝试使用 bool 数组 (y['category']==category) 进行索引以修改原始数组 (y ) 因为 ' fancy indexing ' 返回一个副本(不是 View ),因此修改副本不会更改原始数组 y。如果您只是在普通数组上执行此操作,则效果很好(this confused me in the past)。但是对于像你正在使用的结构化数组,即使用作赋值,它也不会是一个 View ,如果你使用掩码然后再次使用字段名进行索引。这听起来令人困惑,但它不会像您编写的那样工作,请注意 y 前后没有变化:

for i, category in x:
c = y['category']==category #generate the mask once
if y[c]['value'][0] > 3:
print 'before:', y[c]['output']
y[c]['output'] = i
print 'after:', y[c]['output']

#output:
#before: [0]
#after: [0]
#before: [0]
#after: [0]
#before: [0]
#after: [0]

如果您使用字段访问获得一个 View ,然后在该 View 上获得花式索引,您将获得一个有效的 setitem 调用:

for i, category in x:
c = y['category']==category #generate the mask once
if y[c]['value'][0] > 3:
print 'before:', y[c]['output']
y['output'][c] = i
print 'after:', y[c]['output']

#output:
#before: [0]
#after: [1]
#before: [1]
#after: [3]
#before: [0]
#after: [4]

如您所见,我也删除了您的副本。 i(或 id,我没有使用它,因为 id 是一个函数)只是一个整数,不需要复制。如果确实需要复制某些东西,最好使用 numpy 复制而不是标准库 copy,如

y[...]['output'] = np.array(id, copy=True)

y[...]['output'] = np.copy(id)

事实上,copy=True 应该是默认的,所以 ... = np.array(id) 可能就足够了,但我不是复制的权威.

关于python - 根据相关结构选择python结构中的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16306483/

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