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

时间:2015-05-07 21:13:45

标签: python numpy

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

array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3],
       [4, 4, 4],
       [5, 5, 5]])

我的1D阵列是

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

我无法弄清楚如何有效地做到这一点,有没有人有任何想法?

2 个答案:

答案 0 :(得分:8)

您可以使用np.repeat()重复数组的元素。

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

答案 1 :(得分:1)

基于np.cumsum -

的一种方法
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(),:]