python numpy argmax 到多维数组中的最大值
python numpy argmax to max in multidimensional array
我有以下代码:
import numpy as np
sample = np.random.random((10,10,3))
argmax_indices = np.argmax(sample, axis=2)
即我沿 axis=2 取 argmax,它给了我一个 (10,10) 矩阵。现在,我想为这些索引分配值 0。为此,我想索引示例数组。我试过了:
max_values = sample[argmax_indices]
但它不起作用。我想要类似
的东西
max_values = sample[argmax_indices]
sample[argmax_indices] = 0
我只是通过检查 max_values - np.max(sample, axis=2)
应该给出形状为 (10,10) 的零矩阵来验证。
任何帮助将不胜感激。
这是一种方法 -
m,n = sample.shape[:2]
I,J = np.ogrid[:m,:n]
max_values = sample[I,J, argmax_indices]
sample[I,J, argmax_indices] = 0
分步示例 运行
1) 示例输入数组:
In [261]: a = np.random.randint(0,9,(2,2,3))
In [262]: a
Out[262]:
array([[[8, 4, 6],
[7, 6, 2]],
[[1, 8, 1],
[4, 6, 4]]])
2) 沿 axis=2
获取 argmax 索引:
In [263]: idx = a.argmax(axis=2)
3) 获取用于索引前两个 dims 的形状和数组:
In [264]: m,n = a.shape[:2]
In [265]: I,J = np.ogrid[:m,:n]
4) 使用 I、J 和 idx
的索引使用 advanced-indexing
存储最大值:
In [267]: max_values = a[I,J,idx]
In [268]: max_values
Out[268]:
array([[8, 7],
[8, 6]])
5) 在从 max_values
中减去 np.max(a,axis=2)
之后验证我们得到的是一个全 zeros
数组:
In [306]: max_values - np.max(a, axis=2)
Out[306]:
array([[0, 0],
[0, 0]])
6) 再次使用 advanced-indexing
将这些位置指定为 zeros
并再进行一级视觉验证:
In [269]: a[I,J,idx] = 0
In [270]: a
Out[270]:
array([[[0, 4, 6], # <=== Compare this against the original version
[0, 6, 2]],
[[1, 0, 1],
[4, 0, 4]]])
np.ogrid
的替代方法是 np.indices
。
I, J = np.indices(argmax_indices.shape)
sample[I,J,argmax_indices] = 0
这也可以推广到处理任何维度的矩阵。生成的函数会将矩阵的每个 1-d 向量中沿任何所需维度 d(在原始问题的情况下为维度 2)的最大值设置为 0(或所需的任何值):
def set_zero(sample, d, val):
"""Set all max value along dimension d in matrix sample to value val."""
argmax_idxs = sample.argmax(d)
idxs = [np.indices(argmax_idxs.shape)[j].flatten() for j in range(len(argmax_idxs.shape))]
idxs.insert(d, argmax_idxs.flatten())
sample[idxs] = val
return sample
set_zero(sample, d=2, val=0)
(在 python 3.6.4 和 python 2.7.14 上针对 numpy 1.14.1 进行了测试)
我有以下代码:
import numpy as np
sample = np.random.random((10,10,3))
argmax_indices = np.argmax(sample, axis=2)
即我沿 axis=2 取 argmax,它给了我一个 (10,10) 矩阵。现在,我想为这些索引分配值 0。为此,我想索引示例数组。我试过了:
max_values = sample[argmax_indices]
但它不起作用。我想要类似
的东西max_values = sample[argmax_indices]
sample[argmax_indices] = 0
我只是通过检查 max_values - np.max(sample, axis=2)
应该给出形状为 (10,10) 的零矩阵来验证。
任何帮助将不胜感激。
这是一种方法 -
m,n = sample.shape[:2]
I,J = np.ogrid[:m,:n]
max_values = sample[I,J, argmax_indices]
sample[I,J, argmax_indices] = 0
分步示例 运行
1) 示例输入数组:
In [261]: a = np.random.randint(0,9,(2,2,3))
In [262]: a
Out[262]:
array([[[8, 4, 6],
[7, 6, 2]],
[[1, 8, 1],
[4, 6, 4]]])
2) 沿 axis=2
获取 argmax 索引:
In [263]: idx = a.argmax(axis=2)
3) 获取用于索引前两个 dims 的形状和数组:
In [264]: m,n = a.shape[:2]
In [265]: I,J = np.ogrid[:m,:n]
4) 使用 I、J 和 idx
的索引使用 advanced-indexing
存储最大值:
In [267]: max_values = a[I,J,idx]
In [268]: max_values
Out[268]:
array([[8, 7],
[8, 6]])
5) 在从 max_values
中减去 np.max(a,axis=2)
之后验证我们得到的是一个全 zeros
数组:
In [306]: max_values - np.max(a, axis=2)
Out[306]:
array([[0, 0],
[0, 0]])
6) 再次使用 advanced-indexing
将这些位置指定为 zeros
并再进行一级视觉验证:
In [269]: a[I,J,idx] = 0
In [270]: a
Out[270]:
array([[[0, 4, 6], # <=== Compare this against the original version
[0, 6, 2]],
[[1, 0, 1],
[4, 0, 4]]])
np.ogrid
的替代方法是 np.indices
。
I, J = np.indices(argmax_indices.shape)
sample[I,J,argmax_indices] = 0
这也可以推广到处理任何维度的矩阵。生成的函数会将矩阵的每个 1-d 向量中沿任何所需维度 d(在原始问题的情况下为维度 2)的最大值设置为 0(或所需的任何值):
def set_zero(sample, d, val):
"""Set all max value along dimension d in matrix sample to value val."""
argmax_idxs = sample.argmax(d)
idxs = [np.indices(argmax_idxs.shape)[j].flatten() for j in range(len(argmax_idxs.shape))]
idxs.insert(d, argmax_idxs.flatten())
sample[idxs] = val
return sample
set_zero(sample, d=2, val=0)
(在 python 3.6.4 和 python 2.7.14 上针对 numpy 1.14.1 进行了测试)