我有一个以下结构的数组,我将其称为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
我该怎么做?
答案 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]])
对4
和5
的响应:如果您不希望在每次操作后更新a
,我们可以更新屏蔽值数组并写回输入数组在最后。因此,步骤4
和5
将被替换,如下所示 -
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]])