用填充表示numpy中的一个参差不齐的数组

时间:2013-05-02 19:49:11

标签: python numpy

我有一些与某些物体相关的分数的numpy数组scores。这些对象属于一些不相交的组,第一组中所有项目的分数都是第一组,其次是第二组中项目的分数等。

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

scores.reshape((numGroups, groupSize))

不幸的是,我的团队规模可能各不相同。我知道numpy不支持参差不齐的数组,但如果生成的数组只是用指定的值填充每一行以使所有行的长度相同,那么它对我来说没问题。

为了使这一点具体化,假设我已将A设为3项,B设为2项,C设为4项。

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。
  • 可以假设有一些已知的最大行大小
  • 正在评分的原始对象是向量,评分函数是矩阵乘法,这就是我们首先将事物弄平的原因。在进行矩阵乘法之前,可以将所有内容填充到最大项目集大小,但最大集合比平均集合大小大十倍,因此出于速度原因这是不合需要的。

1 个答案:

答案 0 :(得分:2)

试试这个:

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]])