我有一些与某些物体相关的分数的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
吗?
背景:
答案 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]])