获取 `ndarray` 的每个切片中的最小值的索引
Getting the index of the minimum value in each slice of `ndarray`
我正在尝试做一些应该简单明了并且可以在 for 循环 中完成的事情,但我正在努力避免这种情况。
我想获取index每个切片中沿某个轴的最小值numpy.ndarray
,a[=31] =].我对索引比值本身更感兴趣。我使用索引从另一个二维数组中获取一个值,该数组的形状等于 a.
的前两个维度
这是一个使用 for-loop 的简单实现:
a = np.random.randint(0, 10, 60).reshape(3, 4, 5)
print(a)
for i in range(a.shape[-1]):
idx = a[..., i].argmin()
print('Slice:', i, '| Index:', idx, '| min value:',
a[..., i].flat[idx])
输出:
[[[1 9 4 0 7]
[6 3 1 6 8]
[7 8 2 0 2]
[8 6 1 6 5]]
[[8 7 0 6 9]
[7 2 6 4 5]
[3 4 9 2 9]
[1 4 8 0 7]]
[[1 4 6 6 2]
[9 9 5 6 7]
[6 2 8 9 9]
[3 9 8 5 4]]]
Slice: 0 | Index: 0 | min value: 1
Slice: 1 | Index: 5 | min value: 2
Slice: 2 | Index: 4 | min value: 0
Slice: 3 | Index: 0 | min value: 0
Slice: 4 | Index: 2 | min value: 2
我意识到我可以将 axis
关键字参数传递给 argmin
,但这不会产生我正在寻找的结果。
对于您问题中给出的具体情况,您可以重塑数组,然后使用 argmin
:
>>> import numpy as np
>>> a = np.array([[[1, 9, 4, 0, 7],
... [6, 3, 1, 6, 8],
... [7, 8, 2, 0, 2],
... [8, 6, 1, 6, 5]],
...
... [[8, 7, 0, 6, 9],
... [7, 2, 6, 4, 5],
... [3, 4, 9, 2, 9],
... [1, 4, 8, 0, 7]],
...
... [[1, 4, 6, 6, 2],
... [9, 9, 5, 6, 7],
... [6, 2, 8, 9, 9],
... [3, 9, 8, 5, 4]]])
>>> a.reshape(-1, a.shape[2]).min(axis=0)
array([1, 2, 0, 0, 2])
>>> a.reshape(-1, a.shape[2]).argmin(axis=0)
array([0, 5, 4, 0, 2])
>>>
shape[2]
是因为这是您 不想 的维度(在本例中为内部维度或行)计算跨度的最小值:您正在计算前两个维度的最小值。
您还需要切片编号:基本上只是元素的第二个索引。这很容易,因为那个是顺序的,就是:
slices = np.arange(a.shape[2])
我正在尝试做一些应该简单明了并且可以在 for 循环 中完成的事情,但我正在努力避免这种情况。
我想获取index每个切片中沿某个轴的最小值numpy.ndarray
,a[=31] =].我对索引比值本身更感兴趣。我使用索引从另一个二维数组中获取一个值,该数组的形状等于 a.
这是一个使用 for-loop 的简单实现:
a = np.random.randint(0, 10, 60).reshape(3, 4, 5)
print(a)
for i in range(a.shape[-1]):
idx = a[..., i].argmin()
print('Slice:', i, '| Index:', idx, '| min value:',
a[..., i].flat[idx])
输出:
[[[1 9 4 0 7]
[6 3 1 6 8]
[7 8 2 0 2]
[8 6 1 6 5]]
[[8 7 0 6 9]
[7 2 6 4 5]
[3 4 9 2 9]
[1 4 8 0 7]]
[[1 4 6 6 2]
[9 9 5 6 7]
[6 2 8 9 9]
[3 9 8 5 4]]]
Slice: 0 | Index: 0 | min value: 1
Slice: 1 | Index: 5 | min value: 2
Slice: 2 | Index: 4 | min value: 0
Slice: 3 | Index: 0 | min value: 0
Slice: 4 | Index: 2 | min value: 2
我意识到我可以将 axis
关键字参数传递给 argmin
,但这不会产生我正在寻找的结果。
对于您问题中给出的具体情况,您可以重塑数组,然后使用 argmin
:
>>> import numpy as np
>>> a = np.array([[[1, 9, 4, 0, 7],
... [6, 3, 1, 6, 8],
... [7, 8, 2, 0, 2],
... [8, 6, 1, 6, 5]],
...
... [[8, 7, 0, 6, 9],
... [7, 2, 6, 4, 5],
... [3, 4, 9, 2, 9],
... [1, 4, 8, 0, 7]],
...
... [[1, 4, 6, 6, 2],
... [9, 9, 5, 6, 7],
... [6, 2, 8, 9, 9],
... [3, 9, 8, 5, 4]]])
>>> a.reshape(-1, a.shape[2]).min(axis=0)
array([1, 2, 0, 0, 2])
>>> a.reshape(-1, a.shape[2]).argmin(axis=0)
array([0, 5, 4, 0, 2])
>>>
shape[2]
是因为这是您 不想 的维度(在本例中为内部维度或行)计算跨度的最小值:您正在计算前两个维度的最小值。
您还需要切片编号:基本上只是元素的第二个索引。这很容易,因为那个是顺序的,就是:
slices = np.arange(a.shape[2])