Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python创建类的多个实例_Python_Class_Numpy_Object_Initialization - Fatal编程技术网

Python创建类的多个实例

Python创建类的多个实例,python,class,numpy,object,initialization,Python,Class,Numpy,Object,Initialization,我正在尝试创建一个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__':

我正在尝试创建一个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>]]
[[
]
[
]]
它似乎创建了同一对象的数组。我的问题是如何为每个像素初始化具有不同对象的阵列


您可以使用
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>]]
结果如下:

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)
对象

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

如果查看numpy.full(此处:)的源代码,您将看到它将您提供给它的对象复制n次到给定的数组中。您将不得不使用另一种方法,或者循环并复制(这对于大数组来说不是最佳的)
full
对于数值是可以的,这将是唯一的。但是您正在构造一个对象数据类型数组,它像
列表一样包含指向内存中其他位置对象的指针。如果使用列表复制,您会遇到同样的问题。