肿块附加和普通附加

时间:2018-12-01 02:36:45

标签: python list numpy append atom-editor

x = [[1,2],[2,3],[10,1],[10,10]]

def duplicatingRows(x, l):
    severity = x[l][1]
    if severity == 1 or severity == 2:
        for k in range(1,6):
            x.append(x[l])

for l in range(len(x)):
    duplicatingRows(x,l)

print(x)            

x = np.array([[1,2],[2,3],[10,1],[10,10]])

def duplicatingRows(x, l):
    severity = x[l][1]
    if severity == 1 or severity == 2:
        for k in range(1,6):
            x = np.append(x, x[l])

for l in range(len(x)):
    duplicatingRows(x,l)

print(x)

我希望它打印出带有附加行的数组。 列出[[1, 2], [2, 3], [10, 1], [10, 10], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [10, 1], [10, 1], [10, 1], [10, 1], [10, 1]]。为什么不起作用?我也尝试了使用串联的不同组合,但是没有用。

2 个答案:

答案 0 :(得分:1)

您的代码中有一些错误。这是对代码进行了一些改进,正确和(部分)矢量化的实现,可以打印所需的输出。

在这里,我们利用numpy.tile来重复行,然后进行整形,以便我们可以沿着轴0附加它,这是需要的。

In [24]: x = np.array([[1,2],[2,3],[10,1],[10,10]]) 

         def duplicatingRows(x, l): 
             severity = x[l][1] 
             if severity == 1 or severity == 2:
                 # replaced your `for` loop
                 # 5 corresponds to `range(1, 6)`
                 reps = np.tile(x[l], 5).reshape(5, -1) 
                 x = np.append(x, reps, axis=0) 
             return x 

         for l in range(len(x)): 
             x = duplicatingRows(x,l) 

         print(x)

输出

[[ 1  2]
 [ 2  3]
 [10  1]
 [10 10]
 [ 1  2]
 [ 1  2]
 [ 1  2]
 [ 1  2]
 [ 1  2]
 [10  1]
 [10  1]
 [10  1]
 [10  1]
 [10  1]]

答案 1 :(得分:0)

让我们采用全阵列方法

In [140]: arr = np.array([[1,2],[2,3],[10,1],[10,10]])
In [141]: arr
Out[141]: 
array([[ 1,  2],
       [ 2,  3],
       [10,  1],
       [10, 10]])

我们要复制第二列具有1或2的行,对吗? isin是一个很好的“遮罩”(我们也可以使用==any):

In [142]: np.isin(arr[:,1],[1,2])
Out[142]: array([ True, False,  True, False])
In [143]: torepeat = arr[np.isin(arr[:,1],[1,2])]
In [144]: torepeat
Out[144]: 
array([[ 1,  2],
       [10,  1]])

np.repeat在复制值方面做得很好,我们可以简单地将其与原始值连接起来:

In [145]: repeated = np.repeat(torepeat,5, axis=0)
In [146]: np.concatenate((arr, repeated),axis=0)
Out[146]: 
array([[ 1,  2],
       [ 2,  3],
       [10,  1],
       [10, 10],
       [ 1,  2],
       [ 1,  2],
       [ 1,  2],
       [ 1,  2],
       [ 1,  2],
       [10,  1],
       [10,  1],
       [10,  1],
       [10,  1],
       [10,  1]])

np.append使用concatenate。将单个元素添加到1d数组中可以正常工作,但在使用较大尺寸时变得更加棘手。对列表追加的模仿很差。同样,循环中的重复连接相对较慢。通常,我们建议使用列表追加,最后以单个数组构建。

另一种迭代使用repeat的方式:

In [164]: np.concatenate([np.repeat(a[None,:], 5, axis=0) for a in arr if (a[1]==1 or a[1]==2)], axis=0)
Out[164]: 
array([[ 1,  2],
       [ 1,  2],
       [ 1,  2],
       [ 1,  2],
       [ 1,  2],
       [10,  1],
       [10,  1],
       [10,  1],
       [10,  1],
       [10,  1]])