什么是在迭代索引上迭代多维数组和跟踪/执行操作的最佳方法

时间:2016-03-22 21:48:02

标签: python arrays numpy multidimensional-array

我需要在多维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: Beginner nditer我读到使用nditer或使用numpy中的迭代通常意味着我做错了什么。但我找不到另一种方便的方法来实现我的目标,没有任何迭代。显然,我一般都是numpy和python的初学者,因此非常感谢任何搜索或提示的关键字。

1 个答案:

答案 0 :(得分:1)

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电话大致相同)。