python - 如何有条件地更改数组值

标签 python numpy

我需要“有条件地”向现有的 numpy 数组添加 2 个新列,并希望在不太复杂的情况下解决它。

假设我有以下数组:

a = np.array([[1,  2], 
              [-1, 4],
              [1,  6],
              [-1, 8]])

对于这个数组,我需要添加 2 个新列,这将使数组如下所示:

a = np.array([[1,  2, 2, 0 ], 
              [-1, 4, 2, 4 ],
              [1,  6, 8, 4 ],
              [-1, 8, 8, 12]])

这是其背后的逻辑:

原始数组有 2 列。输出有 4 列。 (3. 和 4. 列是新的。)

第 3 列本质上是第二列的增量总和,但仅当数组第一列中对应的值为 1 时,您才继续添加第 2 列中的值(来自 [:, 1])( [:, 0]).例如:

  • a[0, 2] 是 2 因为 a[0, 1] 是 2 我们取它是因为 a[0,0] = 1
  • a[1, 2] 保持为 "2"因为 a[1,0]=(-1) 所以我们跳过 a[1, 1] 的值
  • a[2, 2] 变成 (2 + 6 =) 8。它是 a[0, 2] 和 a[2, 2] 的和。我们只对第 2 列的值求和,只要第一列中对应的行值不是 (-1)。
  • a[3, 2] 保持为 8 因为 a[3, 0] = (-1) 所以 a[3, 1] 不会被添加到总和中。

创建 4. 列是相同的,但这次您只需添加第二列 (a[:, 1]) 的值,只要第一列的行值为 -1。

是否有任何库函数以一种很好的方式支持这样的操作?

最佳答案

你可以使用 np.cumsum第一列中的掩码与第二列中的乘积以获得累积和,然后 numpy.stack加入数组:

import numpy as np

a = np.array([[1, 2],
              [-1, 4],
              [1, 6],
              [-1, 8]])

mask = a[:, 0] == 1
third = np.cumsum(a[:, 1] * mask).reshape(-1, 1)

mask = a[:, 0] == -1
fourth = np.cumsum(a[:, 1] * mask).reshape(-1, 1)

result = np.hstack((a, third, fourth))

print(result)

输出

[[ 1  2  2  0]
 [-1  4  2  4]
 [ 1  6  8  4]
 [-1  8  8 12]]

请注意,您必须 reshape thirdfourth 以匹配 a 的尺寸。

关于python - 如何有条件地更改数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53715593/

相关文章:

python - 如何添加变量?

python - 如何在Python中检测数组中的值是否在特定范围内并返回二进制数组?

python-3.x - 鉴于我有python中指定的各种范围的概率,我如何生成随机数

python - 属性错误 : 'Tensor' object has no attribute 'reshape'

pandas - 将 numpy 的多列分配给 pandas 数据帧的一个列

python - 输入一系列音符并演奏它们

python - Tkinter 窗口由于列表框中的项目而改变大小

python-3.x - 将文件拆分为 block

python - 如何使用其他文件中的变量作为名称来调用函数

python - Dask:使用groupby获取组中具有最大值的行