比较n维numpy数组中的值
comparing values in numpy array of n-dimension
需要比较 numpy 数组中的每个值,return 1 与最大值比较,0 与其他值比较。我在使用不同数量的 [].
时遇到问题
输入示例:
[[[0.6673975 0.33333233]]
.
.
.
[[0.33260247 0.6673975]]]
预期输出:
[[[1 0]]
.
.
.
[[0 1]]]
让我们创建一个示例案例:
a = np.array([[1, 2, 3], [4, 6, 5], [9, 1, 1]])
然后我们可以在最后一行(倒数第二个 axis
)上使用 for-loop
进行迭代,并相应地修改 axis
:
for i in range(a.shape[-2]):
a[..., i, :] = a[..., i, :] == max(a[..., i, :])
这会将 a
修改为正确的结果:
array([[0, 0, 1],
[0, 1, 0],
[1, 0, 0]])
同样的方法适用于任何矩形 array
,例如:
a = np.array([[1, 2], [4, 3], [9, 7]])
给予:
array([[0, 1],
[1, 0],
[1, 0]])
轴上最大值:
如果按照 Joe 在评论中的建议,您正在寻找沿轴的最大值,那么对于轴 axis
、
np.moveaxis((np.moveaxis(ar, axis, 0) == ar.max(axis)).astype(int), 0, axis)
或者,快一点,
(ar == np.broadcast_to(np.expand_dims(ar.max(axis), axis), ar.shape)).astype(int)
应该涵盖 n 维情况。
例如:
ar = np.random.randint(0, 100, (2, 3, 4))
ar
Out[157]:
array([[[17, 28, 22, 31],
[99, 51, 65, 65],
[46, 24, 93, 4]],
[[ 5, 84, 85, 79],
[ 7, 80, 27, 25],
[46, 80, 90, 3]]])
(ar == np.broadcast_to(np.expand_dims(ar.max(-1), -1), ar.shape)).astype(int)
Out[159]:
array([[[0, 0, 0, 1],
[1, 0, 0, 0],
[0, 0, 1, 0]],
[[0, 0, 1, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]]])
ar.max(-1)
Out[160]:
array([[31, 99, 93],
[85, 80, 90]])
整个数组的最大值:
如果您尝试识别等于整个数组最大值的元素,
(ar == ar.max()).astype(int)
应该给你想要的东西。
需要比较 numpy 数组中的每个值,return 1 与最大值比较,0 与其他值比较。我在使用不同数量的 [].
时遇到问题输入示例:
[[[0.6673975 0.33333233]]
.
.
.
[[0.33260247 0.6673975]]]
预期输出:
[[[1 0]]
.
.
.
[[0 1]]]
让我们创建一个示例案例:
a = np.array([[1, 2, 3], [4, 6, 5], [9, 1, 1]])
然后我们可以在最后一行(倒数第二个 axis
)上使用 for-loop
进行迭代,并相应地修改 axis
:
for i in range(a.shape[-2]):
a[..., i, :] = a[..., i, :] == max(a[..., i, :])
这会将 a
修改为正确的结果:
array([[0, 0, 1],
[0, 1, 0],
[1, 0, 0]])
同样的方法适用于任何矩形 array
,例如:
a = np.array([[1, 2], [4, 3], [9, 7]])
给予:
array([[0, 1],
[1, 0],
[1, 0]])
轴上最大值:
如果按照 Joe 在评论中的建议,您正在寻找沿轴的最大值,那么对于轴 axis
、
np.moveaxis((np.moveaxis(ar, axis, 0) == ar.max(axis)).astype(int), 0, axis)
或者,快一点,
(ar == np.broadcast_to(np.expand_dims(ar.max(axis), axis), ar.shape)).astype(int)
应该涵盖 n 维情况。
例如:
ar = np.random.randint(0, 100, (2, 3, 4))
ar
Out[157]:
array([[[17, 28, 22, 31],
[99, 51, 65, 65],
[46, 24, 93, 4]],
[[ 5, 84, 85, 79],
[ 7, 80, 27, 25],
[46, 80, 90, 3]]])
(ar == np.broadcast_to(np.expand_dims(ar.max(-1), -1), ar.shape)).astype(int)
Out[159]:
array([[[0, 0, 0, 1],
[1, 0, 0, 0],
[0, 0, 1, 0]],
[[0, 0, 1, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]]])
ar.max(-1)
Out[160]:
array([[31, 99, 93],
[85, 80, 90]])
整个数组的最大值:
如果您尝试识别等于整个数组最大值的元素,
(ar == ar.max()).astype(int)
应该给你想要的东西。