如何在NumPy阵列的区域上执行一系列操作?

时间:2017-10-11 14:00:43

标签: arrays python-3.x numpy

我有一个以下结构的数组,我将其称为x:

gmres

我希望做的是在这个数组上执行一系列方程,但每次只在数组的特定部分执行,并保持数组结构相同。

我知道使用np.where根据条件来定位值,例如:

1 2 3 4 2 3 4 5 3 4 5 6

现在执行上述返回:

loc = np.where(x >4)

但是使用(array([1, 2, 2], dtype=int64), array([3, 2, 3], dtype=int64))会返回原始值,虽然这些值不是我想要的,但它只返回那些值,而不是整个数组。

所以我想要的输出是让初始数组x与上面相同:

x[loc]

从那里对满足给定条件的值执行一系列操作,并保持数组完整,因此对于给定的等式如下:

1 2 3 4 2 3 4 5 3 4 5 6

仅对大于5的值(5*x+1)执行,并将数组保持在相同的结构中,以便产生。

x>5

我该怎么做?

1 个答案:

答案 0 :(得分:2)

以下是使用masking作为示例案例的一种方法 -

1)设置样本输入:

In [373]: np.random.seed(0)

In [374]: a = np.random.randint(0,9,(3,4))

In [375]: a
Out[375]: 
array([[5, 0, 3, 3],
       [7, 3, 5, 2],
       [4, 7, 6, 8]])

2)获取面具:

In [376]: mask = a>4

In [377]: mask
Out[377]: 
array([[ True, False, False, False],
       [ True, False,  True, False],
       [False,  True,  True,  True]], dtype=bool)

3)获取蒙面值:

In [378]: a_masked = a[mask]

4)使用屏蔽值的计算更新屏蔽的位置:

In [380]: a[mask] = 5*a_masked + 1

In [381]: a
Out[381]: 
array([[26,  0,  3,  3],
       [36,  3, 26,  2],
       [ 4, 36, 31, 41]])

5)对于更多操作,再次获取屏蔽值并重复 -

In [382]: a_masked = a[mask]

In [383]: a[mask] = a_masked + 100

In [384]: a
Out[384]: 
array([[126,   0,   3,   3],
       [136,   3, 126,   2],
       [  4, 136, 131, 141]])

45的响应:如果您不希望在每次操作后更新a,我们可以更新屏蔽值数组并写回输入数组在最后。因此,步骤45将被替换,如下所示 -

In [386]: a # Input array
Out[386]: 
array([[5, 0, 3, 3],
       [7, 3, 5, 2],
       [4, 7, 6, 8]])

In [387]: a_masked = a[mask]

In [388]: a_masked = 5*a_masked + 1 # operation #1

In [389]: a_masked = a_masked + 100 # operation #2

In [390]: a[mask] = a_masked        # write back to input array

In [391]: a
Out[391]: 
array([[126,   0,   3,   3],
       [136,   3, 126,   2],
       [  4, 136, 131, 141]])