使用Numpy / Python单独在数组的特定元素上应用概率函数

时间:2015-03-18 05:28:43

标签: python arrays numpy

我是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,并且阵列结构是守恒的。

谢谢

1 个答案:

答案 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.vectorizesize选项已经解决了这个问题。