Numpy数组条件操作面具?

时间:2016-11-20 20:44:56

标签: python arrays numpy

假设你有一个数组:

a = [ 0,1,0] [-1,2,1] [3,-4,2]

并且假设您在所有内容中添加20

b = [ 20, 21, 20] [ 19, 22, 21] [ 23, 16, 22]

现在假设我想将结果b添加到原始数组a,但仅限于a < 0即索引[0,1][1,2]的情况其中a = -1, -4分别获取值0,否则。最终导致矩阵如此:

c = [ 0, 0, 0] [ 18, 0, 0] [ 0, 12, 0] 18 = 19 (from b) + -1 (from a) 12 = 16 (from b) + -4 (from a)

并且假设我希望能够将此扩展到任何操作(不仅仅是添加20),这样您就不能只过滤所有值&lt; 20来自矩阵c。所以我想使用矩阵a作为矩阵c的掩码,将i, j归零a[i,j] < 0

我很难找到如何使用python在numpy中执行此操作的简明示例。我希望你能指导我正确实施这种方法。

我正在努力获得的是这个掩码并且仅对保留的值执行操作,最终导致c

感谢您的帮助。

5 个答案:

答案 0 :(得分:5)

可能类似于:

(a + b)*(a<0)

除非您对中间数组的数量有很强的要求,否则应该有效。

答案 1 :(得分:1)

您可以通过boolean indexingbroadcasting的组合来完成此操作。下面的工作示例,

import numpy as np
a = np.array([[ 0,1,0],[-1,2,1],[3,-4,2]])
b = a+20
c = np.zeros(a.shape)
c[a<0] = b[a<0] + a[a<0]

c作为

array([[  0.,   0.,   0.],
       [ 18.,   0.,   0.],
       [  0.,  12.,   0.]])

上面代码段中唯一重要的一行是最后一行。由于abc的条目都已对齐,我们可以说我们只需要c的相应索引a<0 ba a<0

中的条目总和

答案 2 :(得分:0)

也许不是最干净的解决方案,但是这个怎么样?:

def my_mask(a, b, threshold=0):
    c = numpy.zeros(a.shape)
    idx = np.where(a < threshold)
    for ii in idx:
        c[ii[1], ii[0]] = a[ii[1], ii[0]] + b[ii[1], ii[0]]
    return c

答案 3 :(得分:0)

使用[[ 0 0 0] [18 0 0] [ 0 12 0]] 函数的解决方案:

        COSDictionary fdict = new COSDictionary();

        fdict.setInt(COSName.FUNCTION_TYPE, 2); // still not understaning that...

        COSArray domain = new COSArray();
        domain.add(COSInteger.get(0));
        domain.add(COSInteger.get(1));

        COSArray c0 = new COSArray();
        c0.add(COSFloat.get("0.64176"));
        c0.add(COSFloat.get("0.72588"));
        c0.add(COSFloat.get("0.78078"));

        COSArray c1 = new COSArray();
        c1.add(COSFloat.get("0.57176"));
        c1.add(COSFloat.get("0.62588"));
        c1.add(COSFloat.get("0.70078"));

        fdict.setItem(COSName.DOMAIN, domain);
        fdict.setItem(COSName.C0, c0);
        fdict.setItem(COSName.C1, c1);
        fdict.setInt(COSName.N, 1);

        PDFunctionType2 func = new PDFunctionType2(fdict);

        PDShadingType2 axialShading = new PDShadingType2(new COSDictionary());

        axialShading.setColorSpace(PDDeviceRGB.INSTANCE);
        axialShading.setShadingType(PDShading.SHADING_TYPE2);

        COSArray coords1 = new COSArray();
        coords1.add(COSInteger.get(0));
        coords1.add(COSInteger.get(0));
        coords1.add(COSInteger.get(850)); // size of my page
        coords1.add(COSInteger.get(600));

        axialShading.setCoords(coords1); // so this sets the bounds of my gradient
        axialShading.setFunction(func); // and this determines all the curves etc?

        CStr.shadingFill(axialShading); // where CStr is a ContentStream for my PDDocument

输出:

{{1}}

答案 4 :(得分:0)

这是获得相同结果的另一种方法:

c = np.where(a < 0, a + b, 0)

尽管这比Thomas Baruchel's solution更为冗长,但是我发现方法签名类似于三元运算(a < 0 ? a + b : 0),这使我更容易立即了解它在做什么。而且,这仍然是一种单线,我认为它足够优雅。

参考:numpy.where