如何让Numpy数组每个元素为独立自定义对象实例?
创建包含独立对象实例的Numpy数组
你遇到的问题是用numpy.full时,fill_value传入单个ExampleObject实例,导致数组所有元素都指向同一个对象,代码示例如下:
import numpy as np class ExampleObject(): pass my_array = np.full( shape=(3, 3), fill_value=ExampleObject(), ) for i in range(3): for j in range(3): print(id(my_array[i][j])) # 所有元素输出相同的id
原因很明确:fill_value是预先创建好的单个实例,numpy只是把这个实例的引用复制到数组的每个位置。
你尝试的numpy.fill写法本身就有问题——numpy.fill是现有数组的方法,不是用来创建新数组的函数,所以才会报错。下面提供几种可行的实现方式:
方法1:二维列表推导式转numpy数组
直接生成包含独立对象的二维列表,再转为object类型的numpy数组:
import numpy as np class ExampleObject(): pass # 生成3x3的二维列表,每个元素都是新的ExampleObject实例 my_array = np.array([[ExampleObject() for _ in range(3)] for _ in range(3)], dtype=object) # 验证每个元素都是独立实例 for i in range(3): for j in range(3): print(id(my_array[i][j])) # 每个id都不相同
方法2:使用numpy.fromfunction结合工厂函数
numpy.fromfunction会对数组的每个坐标调用传入的函数,利用这一点可以为每个位置生成新实例:
import numpy as np class ExampleObject(): pass # 工厂函数:每次调用返回新的ExampleObject实例 def create_new_obj(i, j): return ExampleObject() # 根据形状生成数组,每个元素由create_new_obj生成 my_array = np.fromfunction(create_new_obj, shape=(3,3), dtype=object)
这种方法适合需要根据数组坐标生成不同对象的场景,灵活性更高。
方法3:先创建空数组再逐个赋值
先初始化一个object类型的空数组,然后遍历每个位置赋值新实例:
import numpy as np class ExampleObject(): pass # 创建空的3x3 object类型数组 my_array = np.empty((3,3), dtype=object) # 逐个位置赋值新实例 for i in range(3): for j in range(3): my_array[i][j] = ExampleObject()
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

