用argmin(a)的返回值作下标存取数组

numpy_argmin.py

本习题的程序文件

NumPy的argmin(a)可以很容易获得数组a中最小值的下标,通过axis参数可以指定其计算最小值的轴。然而如果数组a是多维数组,使用最小值下标获得数组中对应的最小值还需要费一番周折。如果能解决多维数组的下标存取问题,那么可以用数组a的最小值下标获取另外一个数组b中对应的值,实现一些比较复杂的数值统计运算。此外,argmax()和argsort()也返回类似的下标数组,因此本习题的答案也可以用于这两个函数所返回的下标。

一维数组

先看看最简单的一维数组:

>>> a1
array([44, 47, 64, 67, 67,  9, 83, 21, 36, 87])
>>> b1
array([70, 88, 88, 12, 58, 65, 39, 87, 46, 88])

a1的最小值9所对应的b1中的值为65。请编写程序完成这个计算:

import numpy as np
np.random.seed(0)
a1 = np.random.randint(0, 100, 10)
b1 = np.random.randint(0, 100, 10)
【你的程序】找到a1的最小值所对应的b1的值

二维数组

对于多维的情况,下标运算会比较复杂,例如对于下面的二维数组a2和b2:

>>> a2
array([[44, 47, 64, 67],
       [67,  9, 83, 21],
       [36, 87, 70, 88]])
>>> b2
array([[88, 12, 58, 65],
       [39, 87, 46, 88],
       [81, 37, 25, 77]])

数组a2沿着第0轴的最小值分别为:[36, 9, 64, 21],它们在第0轴上的下标分别为:[2, 1, 0, 1]。 数组b2中与这些最小值对应的数为:[81, 87, 58, 88]。

请编写程序:

np.random.seed(0)
a2 = np.random.randint(0, 100, (3,4))
b2 = np.random.randint(0, 100, (3,4))
【你的程序】找到a1中沿第0轴的最小值所对应的b1的值
如果改为沿第1轴计算最小值,那么程序需要做哪些改变?

多维数组

请编写函数min_at(a, b, axis=-1),对任意维数的数组a和b,实现上述的最小值运算。axis参数为计算数组a中最小值的轴。

def min_at(a, b, axis=-1):
    "获得沿axis轴,数组a中的最小值所对应的数组b中的值"
    【你的程序】

# 用下面的程序检测min_at()的一维和二维数组的结果
print np.all(min_at(a1,a1) == np.min(a1))
print np.all(min_at(a2,a2) == np.min(a2, axis=-1))
print np.all(min_at(a2,a2,0) == np.min(a2, axis=0))

# 用下面的程序检测min_at()的三维数组的结果
np.random.seed(0)
a3 = np.random.randint(0, 100, (3,4,5))
for i in xrange(3):
    print "axis:", i
    print np.all(min_at(a3, a3, i) == np.min(a3, axis=i))
程序中会用到NumPy中的ix_(),请在IPython中输入“np.ix_?”查看其说明文档。
和argmin()类似,argmax()获得最大值的下标,而argsort()获得排序下标。由于argsort()所返回的下标数组的形状和其参数数组的形状相同,因此使用它所返回的下标存取数组的程序略有不同。能编写一个sort_at()实现和min_at()类似的功能吗?

內容目录

上一个主题

研究list和array的内存增长模式

下一个主题

对多个数组做矩阵乘法运算

本页

loading...