我需要在多维 numpy 数组上做很多操作,因此我正在尝试最好的方法。
所以假设我有一个这样的数组:
A = np.random.uniform(0, 1, size = 100).reshape(20, 5)
我的目标是获取每个条目及其索引的最大值numpy.amax()
。所以A[0]
可能是这样的:
A[0] = [ 0.64570441 0.31781716 0.07268926 0.84183753 0.72194227]
我想获得该最大值[0.84183753][0, 3]
的最大值和索引。不需要结果的具体表示,只是一个示例。我什至只需要水平索引。
我尝试使用 numpy 的 nditer 对象:
A_it = np.nditer(A, flags=['multi_index'], op_flags=['readwrite'])
while not A_it.finished:
print(np.amax(A_it.value))
print(A_it.multi_index[1])
A_it.iternext()
我可以通过这种方式在迭代中访问数组的每个元素及其索引,但我似乎无法将每个元素中的numpy.amax()
函数和索引语法结合在一起。我甚至可以使用nditer
对象来做到这一点吗?
此外,在 Numpy:初学者 nditer 中,我读到在 numpy 中使用 nditer
或使用迭代通常意味着我做错了什么。但是在没有任何迭代的情况下,我找不到另一种方便的方式来实现我的目标。显然,我是一个完全的 numpy 和 python 初学者,所以任何要搜索或提示的关键字都非常感谢。
nditer
的一个主要问题是它遍历每个元素,而不是每一行。 它最好用作重写代码的 Cython 或 C 的垫脚石。
如果您只想要数组中每一行的最大值,那么简单的迭代或列表推导会很好。
for row in A: print(np.amax(row))
或者将其重新转换为数组:
np.array([np.amax(row) for row in A])
但是您可以通过amax
轴参数来获得相同的值
np.amax(A,axis=1)
np.argmax
标识最大值的位置。
np.argmax(A,axis=1)
使用argmax值,您也可以选择最大值,
ind=np.argmax(A,axis=1)
A[np.arange(A.shape[0]),ind]
(速度与重复np.amax
调用大致相同)。