在 Numpy 数组的列中进行条件替换

Posted

技术标签:

【中文标题】在 Numpy 数组的列中进行条件替换【英文标题】:Conditional Replace within a Column of a Numpy Array 【发布时间】:2018-09-19 22:40:28 【问题描述】:

我有一个numpy数组,例如:

theData= [[0, 1, 1, 1],[0, 1, 3, 1],[3, 4, 1, 3],[0, 1, 2, 0],[2, 1, 0, 0]]

如何将第一列中的所有零替换为 -1?

theData[theData==0] = -1 替换整个数组中的所有零很容易,所以我认为这样的事情会起作用

theData[theData[:,0] == 0] = -1
theData[:,0 == 0] = -1

但是对于第一列值为零的任何行,这些都会将行中的所有值更改为 -1。不是我的目标,我想将替换限制在第一列(或其他列)。

这显然可以通过循环来完成。也可以通过将第一列提取为一维数组,在其中进行替换,然后将其转置复制到原始第一列上来完成。但我怀疑有一种更快、更 Pythonic 的方式来做到这一点。也许使用 np.where,但我无法弄清楚。

【问题讨论】:

【参考方案1】:

只要不使用它构建不同的对象,您就可以直接索引该列。检查以下示例:

theData= np.array([[0, 1, 1, 1],[0, 1, 3, 1],[3, 4, 1, 3],[0, 1, 2, 0],[2, 1, 0, 0]])
print(theData)
theData[:,0][theData[:,0] == 0] = -1
print(theData)

结果是这样的:

[[0 1 1 1]
 [0 1 3 1]
 [3 4 1 3]
 [0 1 2 0]
 [2 1 0 0]]
[[-1  1  1  1]
 [-1  1  3  1]
 [ 3  4  1  3]
 [-1  1  2  0]
 [ 2  1  0  0]]

【讨论】:

我似乎一次只能对一列执行此操作...而其余部分被忽略。 arr1 = np.array([[1, 0, np.nan], [2, np.nan, np.nan], [3, 9, np.nan]]) arr1[:,1][arr1[: ,1] == 0] = -1 arr1[:,2][arr1[:,2] == np.nan] = -2 第一次用 -1 替换 0 已完成,但第 3 列中为 NaN不会被 -2 取代。为什么是这样? (我对 Python 很陌生,发现它非常混乱)【参考方案2】:

尝试以下方法:

theData[theData[:,0]==0, 0] = -1

您也可以使用np.where

theData[np.where(theData[:,[0]]==0)] = -1

【讨论】:

这些也是很好的答案,但我不能将两者都标记为答案,所以我将答案授予第一个回复的人。感谢您的帮助!【参考方案3】:

如果您想使用多列进行子集化,则必须使用 np.where()。

例子:

theData= np.array([[0, 1, 1, 1],[0, 1, 3, 1],[3, 4, 1, 3],[0, 1, 2, 0],[2, 1, 0, 0]])
print(theData)
theData[:, [0, 1]][theData[:, [0, 1]] == 0] = -1 # Notice it's [0, 1] instead of [0]
print(theData)

输出是:

[[0 1 1 1]
 [0 1 3 1]
 [3 4 1 3]
 [0 1 2 0]
 [2 1 0 0]]
[[0 1 1 1]
 [0 1 3 1]
 [3 4 1 3]
 [0 1 2 0]
 [2 1 0 0]]

所以数组(theData)没有改变。但是如果你这样做了

theData[np.where(theData[:, [0, 1]] == 0)] = -1
print(theData)

你得到

[[-1  1  1  1]
 [-1  1  3  1]
 [ 3  4  1  3]
 [-1  1  2  0]
 [ 2  1  0  0]]

它看起来也更干净。

【讨论】:

以上是关于在 Numpy 数组的列中进行条件替换的主要内容,如果未能解决你的问题,请参考以下文章

用随机数替换条件下的numpy数组值

python基于组合逻辑判断替换numpy数组中的满足条件的元素相等判断替换numpy数组中的指定数值为另一个数值大小判断替换numpy数组中大于指定阈值的数值为另一个值

从数据框中的列中采样唯一行而不进行替换

使用 dplyr [重复] 有条件地将一列中的值替换为另一列中的值

我可以使用 MySQL 工作台替换 Mysql 中名为“key”的列中的字符串吗?

如何将 numpy 数组存储在 Pandas 数据框的列中?