我是Python / Numpy的新手。我这里有一个标准数组,我有一个我已适当矢量化的函数。
def f(i):
return np.random.choice(2,1,p=[0.7,0.3])*9
f = np.vectorize(f)
定义示例数组:
array = np.array([[1,1,0],[0,1,0],[0,0,1]])
使用向量化函数f,我想评估数组上每个单元格的f值为0.
我试图留下for循环作为最后的手段。我的阵列最终将大于100乘以100,因此单独运行每个单元以查看和评估f可能需要很长时间。
我试过了:
print f(array[array==0])
不幸的是,这给了我一个由5个元素组成的行数组(原始数组中的零)。
或者我尝试过,
array[array==0] = f(1)
但正如预期的那样,这只会将数组的每个零元素转换为0或9。
我正在寻找的是以某种方式给我原始数组,零个元素单独替换。理想情况下,我原始零元素的30%将变为9,并且阵列结构是守恒的。
谢谢
答案 0 :(得分:2)
你的第一次尝试不起作用的原因是因为矢量化函数句柄,我们称之为f_v
以区别于原始f
,正在执行的操作正好5个元素:布尔索引操作array[array==0]
返回的5个元素。 返回 5个值,它不会将这5个项目设置为返回值。你对第二种形式失败原因的分析是现场的。
如果您想解决这个问题,可以将第二种方法与size
选项np.random.choice
相结合:
array = np.array([[1,1,0],[0,1,0],[0,0,1]])
mask = array==0
array[mask] = np.random.choice([18,9], size=mask.sum(), p=[0.7, 0.3])
# example output:
# array([[ 1, 1, 9],
# [18, 1, 9],
# [ 9, 18, 1]])
不需要np.vectorize
:size
选项已经解决了这个问题。