切片numpy数组

时间:2012-06-20 10:43:51

标签: python numpy

this教程中的练习说:

  

生成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循环的情况下执行此操作的另一种方法是什么?

2 个答案:

答案 0 :(得分: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])

答案 1 :(得分:0)

从技术上讲,它不会避免for循环,但是编写它的更加pythonic的方法是避免初始np.ones赋值并只使用列表理解:

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