【问题标题】:Generating new objects when using numpy choice on a list of objects在对象列表上使用 numpy 选择时生成新对象
【发布时间】:2022-01-22 14:31:00
【问题描述】:

我有一个对象列表。我使用带有替换的 numpy 选择从列表中选择多个对象。问题是我正在生成对同一个对象的多个引用。我想要的是生成一个完整的 new 对象列表。

这是我的代码:

import numpy as np
class agent:
    def __init__(self, name):
        self.name = name
parents = []
parents.append(agent("John"))
parents.append(agent("Max"))
parents.append(agent("Alex"))
select_probs = [0.4, 0.3, 0.3]
new_generation = list(np.random.choice(people, 5, replace = True, p = select_probs))
print(new_generation)
# example of output
# [<__main__.agent object at 0x000001F360DC0760>, 
#  <__main__.agent object at 0x000001F360DC03D0>, 
#  <__main__.agent object at 0x000001F360DC0760>, 
#  <__main__.agent object at 0x000001F360DC0760>, 
#  <__main__.agent object at 0x000001F360DC03D0>]

如您所见,我的选择 0、2、3 是同一个对象。我希望他们成为不同的人。将 0x000001F360DC0760 视为父对象,将所选对象视为子对象。

有什么建议我可以使用 numpy 选择来生成新对象,而不是对旧对象的引用?

谢谢。

【问题讨论】:

  • 你为什么用numpy.choice开头?为此使用标准库random 模块。
  • 无论如何,这些函数都不会永远隐式复制对象。如果您希望这种情况发生,您必须以某种方式自己处理(可能只是new_generation = [copy.copy(person) for person in new_generation],甚至[agent(a.name) for a in new_generation]
  • 问题不在于选择功能。问题是当我选择同一个对象时,它会创建对同一个对象的另一个引用。例如,如果您选择整数,就不会遇到这个问题。我需要独立的副本,而不是对同一个副本的多次引用。
  • 如果您使用 python 对象,即int 对象列表,您绝对会遇到同样的问题(当然,对于不可变对象来说,这不应该是个问题)对象)。这对 Python 来说是非常基础的。如果您使用 numpy.ndarray 对象,那就不同了,因为它们基本上是原始数组的包装器。将numpy.random 与 python 列表一起使用是没有意义的,这是我唯一的观点,在任何一种情况下,尽管这两个函数的工作方式相同
  • 您可以在名称上choice,然后从中制作新的对象。

标签: python numpy oop choice


【解决方案1】:

所以上面的解决方案几乎正是我需要的一个小修正:我需要使用深拷贝而不是“浅”拷贝:

new_generation = [copy.deepcopy(person) for person in new_generation]

【讨论】:

  • 嗯,不,你没有,在你发布的例子中没有。
猜你喜欢
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多