this教程中的练习说:
生成10 x 3随机数组(范围
[0,1]
)。对于每一行,请选择最接近0.5
的数字。使用
abs
和argsort
查找每行最近的列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
循环的情况下执行此操作的另一种方法是什么?
答案 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)]