【问题标题】:Numpy append and normal appendNumpy 追加和普通追加
【发布时间】:2019-05-03 04:27:23
【问题描述】:
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]] 的列表。为什么它不起作用?我也尝试了不同的连接组合,但没有奏效。

【问题讨论】:

  • 不要尝试使用 np.append。这不值得。

标签: python list numpy append atom-editor


【解决方案1】:

让我们采用全数组方法

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。将单个元素添加到一维数组中可以正常工作,但在更高维度上使用会变得更加棘手。这是对列表附加的不良模仿。循环中的重复连接也相对较慢。我们通常推荐列表追加,最后使用单个数组构建。

另一种迭代使用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]])

【讨论】:

    【解决方案2】:

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

    在这里,我们利用 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]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-22
      • 2019-11-14
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2013-04-26
      • 1970-01-01
      相关资源
      最近更新 更多