【问题标题】:Matrices with different row lengths in numpynumpy中具有不同行长的矩阵
【发布时间】:2014-08-03 21:40:08
【问题描述】:

有没有办法在 numpy 中定义具有不同长度行的矩阵(例如 m),但使得 m 保持二维(iemndim = 2 )?

例如,如果你定义m = numpy.array([[1,2,3], [4,5]]),那么m.ndim = 1. 我理解为什么会发生这种情况,但我很感兴趣是否有任何方法可以欺骗 numpy 将 m 视为 2D。一个想法是用一个虚拟值填充,以便行变得相同大小,但我有很多这样的矩阵,它会占用太多空间。我真的需要 m 是 2D 的原因是我正在使用 Theano,并且将被赋予 m 值的张量期望一个 2D 值。

【问题讨论】:

  • 我有点困惑。 :-) 你到底想做什么?在 Python/numpy 中可能有更好的方法来处理您的意图。
  • 这是我发布的另一个问题,它准确地解释了我想要做什么:stackoverflow.com/questions/24205187/…

标签: numpy matrix theano


【解决方案1】:

不,这是不可能的。 NumPy 数组的每一对维度都需要是矩形的。这是由于它们映射到内存缓冲区的方式,如指针、项目大小、步幅三倍。

至于这个占用空间:np.array([[1,2,3], [4,5]]) 实际上比 2×3 数组占用更多空间,因为它是一个包含两个指向 Python 列表的指针的数组(即使将元素转换为数组,内存布局也会仍然是低效的)。

【讨论】:

    【解决方案2】:

    我将在这里提供有关 Theano 的非常新的信息。我们有一个新的 TypedList() 类型,它允许拥有所有具有相同类型的元素的 python 列表:比如 1d ndarray。一切都完成了,除了文档。

    您可以使用它们执行的功能有限。但是我们这样做是为了允许使用 scan 遍历类型列表。它尚未与扫描集成,但您现在可以像这样使用它:

    import theano
    import theano.typed_list
    
    a = theano.typed_list.TypedListType(theano.tensor.fvector)()
    s, _ = theano.scan(fn=lambda i, tl: tl[i].sum(),
                       non_sequences=[a],
                       sequences=[theano.tensor.arange(2, dtype='int64')])
    
    f = theano.function([a], s)
    f([[1, 2, 3], [4, 5]])
    

    一个限制是 scan 的输出必须是 ndarray,而不是类型列表。

    【讨论】:

    • 包含 typed_list 模块的版本是什么?我使用的是 Theano 6.0(我可以在 github 上看到的最新版本),它不包含它。
    • 使用开发版。
    • 我一直在玩这个,我遇到了以下问题:当参数函数 (fn) 不会为其所有输入产生具有相同形状的输出时,这会起作用吗?例如,考虑 fn=lambda i, tl: tl + t.constant(1)。那么 fn 的输出与输入具有相同的不均匀长度,这意味着 theano.scan 无法将它们一起打包到 theano.matrix 中。从我的实验来看,这种情况是失败的。这是对的,还是我搞错了?
    • 没错。到目前为止,我们还没有实现从 Scan 返回类型列表的方法。
    猜你喜欢
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多