保留第一个非零元素,将所有其他元素设置为0

时间:2018-08-07 16:51:50

标签: python arrays performance numpy

我有一个二维NumPy数组,如下所示:

array([[0. , 0. , 0.2, 0.2],
       [0.3, 0. , 0.3, 0. ]])

我想对其进行修改,以使每一行都由全0组成,除了第一个非零条目。如果全都是0,那么我们什么都不会改变。

我可以这样做:

example = np.array([[0,0, 0.2, 0.2], [0.3, 0, 0.3, 0]])
my_copy = np.zeros_like(example)
for i, row in enumerate(example):
    for j, elem in enumerate(row):
        if elem > 0:
            my_copy[i, j] = elem
            break

但这是丑陋的,不是矢量化的。关于如何将其向量化的任何建议?

谢谢!

3 个答案:

答案 0 :(得分:5)

这是向量化的解决方案。诀窍是通过(?<1>\\S+) 转换和app.post('/api/cart', (req, res) => { var cart = req.body; req.session.cart = cart; req.session.save(err, sessionCart) =>{ console.log(sessionCart); if(err){ throw err; } res.json(req.session.cart); 计算您的第一个非零条目。

bool

答案 1 :(得分:3)

简单

e =np.zeros(example.shape)
rows = np.arange(example.shape[0])
cols =  np.argmax(example != 0, 1)
e[rows, cols] = example[rows, cols]

答案 2 :(得分:2)

设置

x = np.array([[0. , 0. , 0.2, 0.2],
          [0.3, 0. , 0.3, 0. ],
          [0. , 0. , 0. , 0. ]])

使用 logical_and np.eye

m = (x!=0).argmax(1)
x[~np.logical_and(x, np.eye(x.shape[1])[m])] = 0

输出:

array([[0. , 0. , 0.2, 0. ],
       [0.3, 0. , 0. , 0. ],
       [0. , 0. , 0. , 0. ]])

使用此方法会比其他两个建议的方法慢一些。