1

教程中的练习说:

生成一个 10 x 3 的随机数数组(在 范围内[0,1])。对于每一行,选择最接近 的数字0.5

使用absargsort查找j每行最接近的列。

使用花哨的索引来提取数字。(提示:a[i,j]– 数组i必须包含与 中的内容相对应的行号j。)

所以我做了一切,但我觉得我使用的切片方法(以及 的初始化b)根本不是 pythonic:

a = np.random.rand(10,3)

mask = np.argmin(abs(a-0.5), axis = 1)

b = np.ones(mask.size)

for j in range(0,mask.size):
    b[j] = a[j,mask[j]]

for不使用循环的另一种方法是什么?

4

2 回答 2

5
import numpy as np
a = np.random.rand(10,3)
b = np.argmin(abs(a - .5), axis=1).choose(a.T)

# a
array([[ 0.97272372,  0.45351387,  0.19105835],
       [ 0.27895897,  0.12438789,  0.64857335],
       [ 0.05298066,  0.58122882,  0.805319  ],
       [ 0.39952727,  0.77728036,  0.65742471],
       [ 0.36522802,  0.06938552,  0.6595684 ],
       [ 0.9030323 ,  0.08965774,  0.01823633],
       [ 0.30996923,  0.53400339,  0.87600912],
       [ 0.17953532,  0.4888832 ,  0.0746074 ],
       [ 0.09052476,  0.47397504,  0.30317449],
       [ 0.31851577,  0.68135476,  0.38335483]])

# b
array([ 0.45351387,  0.64857335,  0.58122882,  0.39952727,  0.36522802,
        0.9030323 ,  0.53400339,  0.4888832 ,  0.47397504,  0.38335483])
于 2012-06-20T10:58:24.333 回答
0

从技术上讲,它并没有避免for循环,但是一种更 Pythonic 的编写方式是避免初始np.ones分配,而只使用列表推导:

b = [a[j, mask[j]] for j in range(0, mask.size)]
于 2012-06-20T10:47:46.393 回答