Python 在不使用max内置函数的情况下查找最大值和最大值的索引

Python 在不使用max内置函数的情况下查找最大值和最大值的索引,python,arrays,function,numpy,matrix,Python,Arrays,Function,Numpy,Matrix,正如标题所说,我试图找到参数的最大值和位置,而不使用任何内置max函数的变化 我能够把它拼凑成一个基本的np.array,但是我很难将它转换成矩阵。。。我想是因为它是如何被索引的 以下是我对np.array的介绍: 数组的最大值为4,位于索引4处 我正在尝试为任何大小的矩阵创建类似的东西,而不使用内置的max函数。有人能帮助我使用该函数并帮助我理解基本数组和矩阵在索引方面的区别吗?这适用于一维数组和二维数组: 产出: 这适用于一维阵列和二维阵列: 产出: 这是一种对任何形状和尺寸数组执行此操作的

正如标题所说,我试图找到参数的最大值和位置,而不使用任何内置max函数的变化

我能够把它拼凑成一个基本的np.array,但是我很难将它转换成矩阵。。。我想是因为它是如何被索引的

以下是我对np.array的介绍:

数组的最大值为4,位于索引4处

我正在尝试为任何大小的矩阵创建类似的东西,而不使用内置的max函数。有人能帮助我使用该函数并帮助我理解基本数组和矩阵在索引方面的区别吗?

这适用于一维数组和二维数组:

产出:

这适用于一维阵列和二维阵列:

产出:


这是一种对任何形状和尺寸数组执行此操作的方法。它假定值为非负值,因为您使用0初始化最大值,并且仅返回最大值的第一次关联,就像您在原始答案中所做的那样。当然,您可以轻松地更改它们:

def argmax(x):
    maximum = 0
    for i, v in enumerate(x.reshape(-1)):
        if v > maximum: 
            maximum = v
            pos = i
    print('The maximum value of the array is', maximum, 'and is located at index', np.unravel_index(pos, x.shape))

argmax(a)
例如:

a = np.random.randint(0,10,(3,4))
#[[7 6 2 6]
# [7 2 0 5]
# [4 0 8 7]]
输出:

The maximum value of the array is 8 and is located at index (2, 2)

这是一种对任何形状和尺寸数组执行此操作的方法。它假定值为非负值,因为您使用0初始化最大值,并且仅返回最大值的第一次关联,就像您在原始答案中所做的那样。当然,您可以轻松地更改它们:

def argmax(x):
    maximum = 0
    for i, v in enumerate(x.reshape(-1)):
        if v > maximum: 
            maximum = v
            pos = i
    print('The maximum value of the array is', maximum, 'and is located at index', np.unravel_index(pos, x.shape))

argmax(a)
例如:

a = np.random.randint(0,10,(3,4))
#[[7 6 2 6]
# [7 2 0 5]
# [4 0 8 7]]
输出:

The maximum value of the array is 8 and is located at index (2, 2)

我假设你想找到给定轴上的最大值。否则,请不要np.unravel_indexargmaxa.ravel,a.shape

首先,让我们定义一个函数,该函数沿给定维度逐步移动,并跟踪最大值和它们出现的指数:

def argmax(a, axis):
    # index
    cur = [slice(None) for _ in range(a.ndim)]
    cur[axis] = 0

    # trackers
    val = a[tuple(index)]
    ind = np.zeros(val.shape, dtype=int)

    # loop
    for i in range(1, a.shape[axis]):
        index[axis] = i
        v = a[tuple(index)]
        mask = v > val
        val[mask] = v[mask]
        ind[mask] = i
    return ind
这将沿轴返回索引。如果您想获得其他索引,请执行以下操作

all_indices = list(np.indices(a.shape))
all_indices[axis] = ind
all_indices = tuple(all indices)
或者

all_indices = [slice(None) for _ range(a.ndim)]
all_indices[axis] = ind
all_indices = tuple(all indices)
此函数跳过了几个角情况,例如当a.shape[axis]==0和a.ndim==0时,但您可以通过简单的初步测试轻松处理它们

您还可以使用递归调用,如答案开头所示,使用特殊情况axis=None


如果要同时允许多个轴,请将它们全部交换到端点,然后将它们重塑为单个轴。因此,轴=无和正常处理的混合。我假设您希望找到给定轴上的最大值。否则,请不要np.unravel_indexargmaxa.ravel,a.shape

首先,让我们定义一个函数,该函数沿给定维度逐步移动,并跟踪最大值和它们出现的指数:

def argmax(a, axis):
    # index
    cur = [slice(None) for _ in range(a.ndim)]
    cur[axis] = 0

    # trackers
    val = a[tuple(index)]
    ind = np.zeros(val.shape, dtype=int)

    # loop
    for i in range(1, a.shape[axis]):
        index[axis] = i
        v = a[tuple(index)]
        mask = v > val
        val[mask] = v[mask]
        ind[mask] = i
    return ind
这将沿轴返回索引。如果您想获得其他索引,请执行以下操作

all_indices = list(np.indices(a.shape))
all_indices[axis] = ind
all_indices = tuple(all indices)
或者

all_indices = [slice(None) for _ range(a.ndim)]
all_indices[axis] = ind
all_indices = tuple(all indices)
此函数跳过了几个角情况,例如当a.shape[axis]==0和a.ndim==0时,但您可以通过简单的初步测试轻松处理它们

您还可以使用递归调用,如答案开头所示,使用特殊情况axis=None


如果要同时允许多个轴,请将它们全部交换到端点,然后将它们重塑为单个轴。所以axis=None和正常处理的混合体。

在迭代时,您不能跟踪i和最大值,如果需要,还可以跟踪列j吗?那看起来需要很多额外的工作。将此数组视为一个或多个列表。事实上,当这样迭代时,使用列表列表会更快。你的数组最多是二维的还是更高维的?另外,如果max多次出现,你想要一个random max的位置还是所有的位置?您的数组是否包含所有非负值?@hpaulj。我已经发布了一个相当笼统的答案。我认为使用数组肯定更简单,因为可以使用掩蔽。嘿,各位,谢谢你们的快速回复!这些都是二维阵列。如果出现多次,我更喜欢max的所有位置。并没有负值。你们不能在迭代时跟踪i和最大值,如果需要的话,跟踪j列吗?那看起来需要很多额外的工作。将此数组视为一个或多个列表。事实上,当这样迭代时,使用列表列表会更快。你的数组最多是二维的还是更高维的?另外,如果max多次出现,你想要一个random max的位置还是所有的位置?您的数组是否包含所有非负值?@hpaulj。我已经发布了一个相当笼统的答案。我认为使用数组肯定更简单,因为可以使用掩蔽。嘿,各位,谢谢你们的快速回复!这些都是二维阵列。如果出现多次,我更喜欢max的所有位置。无负值。打印返回无。“你的意思是在函数外打印吗?”MadPhysician说得对。从OP的代码中甚至没有注意到。我假设这是他们想要的产出,但实际上回报是无关紧要的。编辑它。谢谢。打印不返回任何内容。“你的意思是在函数外打印吗?”MadPhysician说得对。从OP的代码中甚至没有注意到。我假设这就是输出
你想要但真正的回报是无关紧要的。编辑它。谢谢,这太完美了!正如我所理解的,j在范围内循环通过列,I在范围内循环通过行?@smcconn5是的,j在列,I在行。这太完美了!正如我所理解的,j在范围内循环通过列,I在范围内循环通过行?@smcconn5是的,j代表列,I代表行