Python 创建一个新数组,有选择地以不同的多重性复制numpy中旧数组的行

Python 创建一个新数组,有选择地以不同的多重性复制numpy中旧数组的行,python,numpy,Python,Numpy,我有一个numpy中有n行的2D数组,以及一个由n个元素组成的1-D数组,其中第I个元素指定原始数组第I行进入新数组的次数。例如,如果我的二维阵列是: array([[1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4], [5, 5, 5]]) 我的一维数组是 array([2, 0, 1, 0, 3]) 那么我希望新阵列是: array([[1, 1, 1], [1, 1, 1],

我有一个numpy中有n行的2D数组,以及一个由n个元素组成的1-D数组,其中第I个元素指定原始数组第I行进入新数组的次数。例如,如果我的二维阵列是:

array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3],
       [4, 4, 4],
       [5, 5, 5]])
我的一维数组是

array([2, 0, 1, 0, 3])
那么我希望新阵列是:

array([[1, 1, 1],
       [1, 1, 1],
       [3, 3, 3],
       [5, 5, 5],
       [5, 5, 5],
       [5, 5, 5]])
我不知道如何有效地执行此操作,有人有什么想法吗?

您可以使用它来重复数组的元素

In [174]: x.repeat(np.array([2, 0, 1, 0, 3]), axis=0)
Out[174]:
array([[1, 1, 1],
       [1, 1, 1],
       [3, 3, 3],
       [5, 5, 5],
       [5, 5, 5],
       [5, 5, 5]])

详情:

In [175]: x
Out[175]:
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3],
       [4, 4, 4],
       [5, 5, 5]])

In [176]: repeat_on = np.array([2, 0, 1, 0, 3])

In [177]: x.repeat(repeat_on, axis=0)
Out[177]:
array([[1, 1, 1],
       [1, 1, 1],
       [3, 3, 3],
       [5, 5, 5],
       [5, 5, 5],
       [5, 5, 5]])
一种基于-


@Divikar我对这个解决方案感兴趣太晚了,因为事实证明numpy.repeat()还不能与pypy一起工作。这是可行的,但如果A是1D数组,它就失败了。你知道如何调整这种情况吗?要回答我自己的问题,请将
out=A[mask][id.cumsum(),:]
更改为
out=A[mask][id.cumsum()]
@BenS。呵呵!有意思,我不知道派比的事!感谢更新,使其适用于1D阵列。
import numpy as np

A = np.array([[1, 1, 1],          # Sample Input Array
       [2, 2, 2],
       [3, 3, 3],
       [4, 4, 4],
       [5, 5, 5]])

lens = np.array([2, 0, 1, 0, 3])  # Sample Lengths of replications

mask = lens!=0                    # Mask of valid lengths
clens = np.cumsum(lens[mask])     # CUMSUM masked lenghts

# Setup Row-ID array for replications
id = np.zeros((1,clens[-1]),int).ravel()
id[clens[:-1]] = 1

# Finally perform replications for the final output
out = A[mask][id.cumsum(),:]