5

我有一个与某些对象相关联的一维 numpyscores分数数组。这些对象属于一些不相交的组,第一组中所有项目的得分都排在第一位,第二组中的项目得分依次类推。

我想创建一个二维数组,其中每一行对应一个组,每个条目是其中一个项目的分数。如果所有组的大小相同,我可以这样做:

scores.reshape((numGroups, groupSize))

不幸的是,我的小组可能大小不一。我知道 numpy 不支持参差不齐的数组,但是如果结果数组只是用指定的值填充每一行以使所有行的长度相同,那对我来说很好。

为了具体说明,假设我设置A了 3 个项目、B2 个项目和C4 个项目。

scores = numpy.array([f(a[0]), f(a[1]), f(a[2]), f(b[0]), f(b[1]), 
                       f(c[0]), f(c[1]), f(c[2]), f(c[3])])
rowStarts = numpy.array([0, 3, 5])
paddingValue = -1.0
scoresByGroup = groupIntoRows(scores, rowStarts, paddingValue)

的期望值scoresByGroup为:

 [[f(a[0]), f(a[1]), f(a[2]), -1.0], 
    [f(b[0]), f(b[1]), -1.0, -1.0]
    [f(c[0]), f(c[1]), f(c[2]), f(c[3])]]

是否有一些我可以用来创建的 numpy 函数或函数组合groupIntoRows

背景:

  • 此操作将用于计算 Theano 中梯度下降算法的小批量损失,这就是为什么我需要尽可能将其保留为 numpy 函数的组合,而不是使用原生 Python。
  • 可以假设有一些已知的最大行大小
  • 被评分的原始对象是向量,评分函数是矩阵乘法,这就是我们首先将事物展平的原因。在进行矩阵乘法之前,可以将所有内容填充到最大项目集大小,但最大集合比平均集合大小大十倍以上,因此出于速度原因,这是不可取的。
4

1 回答 1

6

试试这个:

scores = np.random.rand(9)
row_starts = np.array([0, 3, 5])
row_ends = np.concatenate((row_starts, [len(scores)]))
lens = np.diff(row_ends)
pad_len = np.max(lens) - lens
where_to_pad = np.repeat(row_ends[1:], pad_len)
padding_value = -1.0
padded_scores = np.insert(scores, where_to_pad,
                          padding_value).reshape(-1, np.max(lens))

>>> padded_scores
array([[ 0.05878244,  0.40804443,  0.35640463, -1.        ],
       [ 0.39365072,  0.85313545, -1.        , -1.        ],
       [ 0.133687  ,  0.73651147,  0.98531828,  0.78940163]])
于 2013-05-02T20:33:34.223 回答