如何用自然数替换二进制数组中的1,保持0的位置?

时间:2016-07-20 13:52:53

标签: python arrays numpy scipy

我正在使用Numpy和SciPy。我有两个数组,第一个是二进制数组,第二个数组是从ab的连续自然数范围,例如

mask = np.array([1, 1, 1, 1, 0, 0, 1, 0]) # length of 8, with 5 ones and 3 zeros
vals = np.array([2, 3, 4, 5, 6, 7, 8, 9]) # length of 8, only first 5 values will be used in this case - corresponding to the 5 ones in the first array

我想基本上用第二个中的值替换第一个数组中的1(按顺序保存),例如此示例场景中的所需结果为:

result = [2,3,4,5,0,0,6,0]

我已经尝试过使用NumPy蒙版数组和矢量函数的不同方法。我目前的解决方案如下,但为了维持状态,我不得不引入一个全局变量!

global count
count = 0
def func(a,b):
    global count
    if a ==1:
        return b - count
    else:
        count +=1
        return 0
v_func = np.vectorize(func)
result = v_func(mask, vals)
print result

有没有更优雅的方式,(理想情况下使用NumPy)?

(旁注,我正在使用的真实阵列非常大,因此我的解决方案需要对所消耗的内存量敏感 - 显然我可以转换为稀疏阵列,但我还是尝试找到不同的解决方案,几次遇到内存错误。)

2 个答案:

答案 0 :(得分:2)

这是一种方式:

{{1}}

答案 1 :(得分:2)

这是一个单线,但我必须说它不是一种优化的方式而不是非常优雅。但是你可以为实践目的检查它。

a = [1, 1, 1, 1, 0, 0, 1, 0]
b = [2, 3, 4, 5, 6, 7, 8, 9]

c = [b[sum(a[:i])] if a[i] else 0 for i in range(len(a))]
print c
# Gives [2, 3, 4, 5, 0, 0, 6, 0]