You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建每行元素互不相同的NumPy数组?

问题根因

所有行元素最终完全一致,是两个写法错误共同导致的:

  • np.tile(temp, (3, 1)) 不会生成3个独立的temp类实例,只是把同一个temp类的引用复制了3份填充到数组里,数组所有位置指向的都是同一个类对象
  • 你定义的temp类里,x = []是写在类层级的类属性,是所有实例/类本身共享的属性,不管你通过哪个引用修改它,改的都是同一份数据。

循环内打印看起来值不同,是因为每次赋值后立刻打印当前刚修改的值,等循环走完,最后一次赋值已经把共享的x属性覆盖成了最后生成的随机数组,所以再打印所有行就全是同一个值。

正确实现步骤
  1. 修正类定义,把需要独立存储的属性放到实例初始化方法里,不要定义为类属性
  2. 创建存储自定义对象的numpy数组时,不要用np.tile/np.full这类会复制同一引用的方法,逐个生成独立实例填充到数组对应位置即可。

正确可运行代码如下:

import numpy as np

# 修正类定义,x作为每个实例独立的属性
class temp:
    def __init__(self):
        self.x = []

# 初始化指定dtype为object的空数组,用于存储自定义实例
y = np.empty((3, 1), dtype=object)
# 逐个生成独立实例填充数组
for i in range(3):
    y[i, 0] = temp()

# 执行原本的赋值逻辑
for i in range(3):
    y[i, 0].x = np.random.rand(1,5)
    print(y[i,0].x)

print("===== 循环结束后遍历校验 =====")
for i in range(3):
    print(y[i,0].x)

运行后循环结束再打印,每行存储的都是各自独立的随机数组,不会出现全部一致的问题。

避坑提示
  • 所有存储Python自定义对象的numpy数组,如果需要每个位置是独立对象,都要手动逐个填充新生成的实例,不要用tile、full这类批量填充方法,这类方法对非数值类型只会复制同一引用
  • 类中需要每个实例单独持有的属性,一定要写在__init__方法里通过self.属性名定义,直接写在类下的属性是所有实例共享的类属性,修改时会全局生效。

内容的提问来源于stack exchange,提问作者Rona Freya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 01:49:15