首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy append和normal append

Numpy append和normal append
EN

Stack Overflow用户
提问于 2018-12-01 10:36:45
回答 2查看 93关注 0票数 1
代码语言:javascript
复制
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]]的清单。为什么它不起作用?我也尝试了不同的组合方式,但都不起作用。

EN

回答 2

Stack Overflow用户

发布于 2018-12-01 11:12:26

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

在这里,我们利用numpy.tile来重复行,然后重塑,这样我们就可以沿着轴0附加它,这是所需的。

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
[[ 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
EN

Stack Overflow用户

发布于 2018-12-01 12:47:07

让我们采用全数组的方法

代码语言:javascript
复制
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):

代码语言:javascript
复制
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在复制值方面做得很好,我们可以简单地将其与原始值连接起来:

代码语言:javascript
复制
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。它在将单个元素添加到一维数组中时工作良好,但在更高的维数下使用会变得更加棘手。这是list append的一个糟糕的模仿。此外,循环中的重复连接相对较慢。我们通常推荐列表追加,在末尾使用单个数组构建。

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

代码语言:javascript
复制
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]])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53567301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档