如何将数字添加到numpy数组的元素而不是所有元素?

问题描述

这就是我想要做的: 我有一个二维的numpy数组:

A = [[   0,400,400],[   0,800],800,1010],[ 400,[ 800,910,1010]]

我想为第一列的所有非零元素添加+20。因此,答案应如下所示:

A =[[   0,420,820,1010]]

可以使用循环,但是没有矢量化方法,或者numpy库中是否有某些东西可以实现此目的?

我所能想到的是:

A[:,1] = A[:,1][A[:,1] != 0] + 20

但是它并不能按照我想要的方式工作,因为它只返回带有修改后的非零值的减量数组,因此会产生错误

解决方法

一个简短的版本是

A[A[:,1]!=0,1] += 20

这意味着在第一列的所有行中加20,其中第一列不为零。

更一般

A[A[:,i]!=k,j] += l

将l添加到第j列中的所有行,其中第i列中的行不是k。

,

您可以使用np.where

A[:,1] = np.where(A[:,A[:,1]+20,0)
print(A)

打印:

[[   0    0  400  400]
 [   0  420  400  800]
 [   0  820  400 1010]
 [ 400    0  800  400]
 [ 400  420  800  800]
 [ 400  820  800 1010]
 [ 800    0  910  400]
 [ 800  420  910  800]
 [ 800  820  910 1010]]
,

使用numpy函数apply_along_axis

def addTwenty(x):
  if(x[1] > 0):
    x[1] += 20
  return x
A = np.apply_along_axis(addTwenty,1,A)

打印:

array([[   0,400,400],[   0,420,800],820,1010],[ 400,800,[ 800,910,1010]])