在 Numpy 数组的列中进行条件替换
Conditional Replace within a Column of a Numpy Array
我有一个 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,但我无法弄清楚。
只要不使用它构建不同的对象,就可以直接对该列建立索引。检查以下示例:
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]]
尝试以下操作:
theData[theData[:,0]==0, 0] = -1
您也可以使用 np.where
。
theData[np.where(theData[:,[0]]==0)] = -1
如果您想对不止一列进行子集化,则必须使用 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 数组,例如:
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,但我无法弄清楚。
只要不使用它构建不同的对象,就可以直接对该列建立索引。检查以下示例:
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]]
尝试以下操作:
theData[theData[:,0]==0, 0] = -1
您也可以使用 np.where
。
theData[np.where(theData[:,[0]]==0)] = -1
如果您想对不止一列进行子集化,则必须使用 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]]
它看起来也更干净。