有条件地替换三个2d numpy数组上的值

g9icjywg  于 2023-05-29  发布在  其他
关注(0)|答案(3)|浏览(161)

我有三个2x2的numpy数组如下:

import numpy as np

#create three arrays
one = np.array([[1, -1], 
                [-1, 1]])

two = np.array([[-1, 0], 
                [-2, 2]])

three = np.array([[1, 1], 
                [-4, 3]])

我想创建第四个2x2数组,并替换基于onetwothree的值,以便如果在特定位置,所有三个数组的值都小于1,则使新值为-1,如果所有三个数组的值都大于1,则使新值为1。如果不满足条件,我想将值设为0。
我尝试这样做:

#make a copy of one 
final = one.copy()

#where all of the three initial arrays are > 0 make the value 1
final[(one > 0) & (two > 0) & (three >0)] = 1

#where all of the three initial arrays are < 0 make the value -1
final[(one < 0) & (two < 0) & (three <0)] = -1

其返回:

array([[ 1, -1],
       [-1,  1]])

所以在这种情况下,在[0,0][0,1]的索引我想返回零,而[1,0]应该是-1和[1,1]应该是1或这样:

[0, 0,
[-1, 1]

我认为这是因为我没有说如何在不满足最初的两个条件时将值更改为0,而且我似乎无法解决如何做到这一点。

xeufq47z

xeufq47z1#

您的初始化不正确,您应该设置零而不是“一”的值:

final = np.zeros_like(one)

final[(one > 0) & (two > 0) & (three >0)] = 1
final[(one < 0) & (two < 0) & (three <0)] = -1

输出:

array([[ 0,  0],
       [-1,  1]])

类似于Roman的替代方法,但使用dstackall将比较推广到任意数量的输入数组:

a = np.dstack([one, two, three])
final = np.select([(a>0).all(-1), (a<0).all(-1)], [1, -1])
zqdjd7g9

zqdjd7g92#

使用np.select可在条件上进行多项选择(默认值为0):

final = np.select([(one > 0) & (two > 0) & (three > 0), 
                   (one < 0) & (two < 0) & (three < 0)], [1, -1])
print(final)
[[ 0  0]
 [-1  1]]
tp5buhyn

tp5buhyn3#

另一种可能的解决方案:

n = 3
a = np.stack([one, two, three])
b = np.sign(a).sum(axis=0)
(b == n) - 1*(b == -n)

或者:

a = np.stack([one, two, three])
np.where(np.all(a > 0, axis=0), 1, np.where(np.all(a < 0, axis=0), -1, 0))

输出:

array([[ 0,  0],
       [-1,  1]])

相关问题