【问题标题】:Python Creating Multiple Instances of a ClassPython 创建一个类的多个实例
【发布时间】:2018-06-06 13:50:06
【问题描述】:

我正在尝试创建一个 NumPy 对象数组,如下所示...

import numpy as np

class Pixel:
    def __init__(self):
        self.r = 0
        self.g = 0
        self.b = 0

class Image:
    def __init__(self):
        self.pixels = np.full((4, 4), Pixel())

if __name__ == '__main__':
    image = Image()
    print(image.pixels)

输出是……

[[<__main__.Pixel object at 0x02A92F70>
  <__main__.Pixel object at 0x02A92F70>]
 [<__main__.Pixel object at 0x02A92F70>
  <__main__.Pixel object at 0x02A92F70>]]

似乎创建了一个相同对象的数组。我的问题是如何为每个像素使用不同的对象初始化数组?

亲切的问候

【问题讨论】:

  • 如果您查看 numpy.full 的源代码(此处为:github.com/numpy/numpy/blob/v1.14.2/numpy/core/…),您会看到它将您提供给它的对象 n 次复制到给定的数组中。您将不得不使用另一种方法,或者循环和复制(这对于大数组来说不是最佳的,授予)
  • full 适用于数值,这将是唯一的。但是您正在构建一个对象 dtype 数组,它类似于 list 包含指向内存中其他地方的对象的指针。 alist = [Pixel()]*4 也会遇到同样的问题,列出复制。

标签: python class numpy object initialization


【解决方案1】:

您可以使用np.array 函数并从标准python 列表中对其进行初始化,如下所示:

class Image:
def __init__(self):
    self.pixels = np.array([Pixel() for i in range(2 * 2)]).reshape([2, 2])

结果如下:

[[<__main__.Pixel object at 0x00000218B89F6438>
  <__main__.Pixel object at 0x00000218B89F64A8>]
 [<__main__.Pixel object at 0x00000218B89F4D68>
  <__main__.Pixel object at 0x00000218B89F43C8>]]

如您所见,它们不是同一个对象。

请注意,它不会影响您的时间复杂度,因为无论如何您都需要初始化 O(n) 对象。

【讨论】:

    【解决方案2】:

    感谢所有回复,非常有帮助。我发现最适合我的特定情况的方法是使用 numpy.empty() 方法创建一个正确大小的数组,然后迭代使用新对象填充数组的元素。它可能不是最有效的,但对我来说是最易读的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 2018-07-11
      • 2015-01-01
      • 1970-01-01
      相关资源
      最近更新 更多