假设你有一个数组:
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
。
感谢您的帮助。
答案 0 :(得分:5)
可能类似于:
(a + b)*(a<0)
除非您对中间数组的数量有很强的要求,否则应该有效。
答案 1 :(得分:1)
您可以通过boolean indexing和broadcasting的组合来完成此操作。下面的工作示例,
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.]])
上面代码段中唯一重要的一行是最后一行。由于a
,b
和c
的条目都已对齐,我们可以说我们只需要c
的相应索引a<0
b
和a
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