Python numpy中的行比较

Python numpy中的行比较,python,numpy,Python,Numpy,假设我们有两个numpy阵列: arr = np.array([ [ [1, 2, 3], [4, 5, 6], [7, -8, 9], [10, 11, 12] ], [ [13, 14, -15], [16, -17, 18], [19, 20, 21], [22, 23, 24] ] ]) 及 我试图将comp的每个一维数组与ar

假设我们有两个numpy阵列:

arr = np.array([
    [
        [1, 2, 3],
        [4, 5, 6],
        [7, -8, 9],
        [10, 11, 12]
    ],
    [
        [13, 14, -15],
        [16, -17, 18],
        [19, 20, 21],
        [22, 23, 24]
    ]
])

我试图将
comp
的每个一维数组与
arr
的二维数组(按行)进行比较,即

如果下一行不满足条件,则对
comp
求反,然后进行比较:

[-2, 20, -4], [4, 5, 6] = [-1 1 -1]
如果没有其他内容满足put
0

对于来自
arr
的第二个样本,它应与
comp
的第二个1D进行比较,即:

[2, 20, 4], [13, 14, -15] = [...]
所以应该是这样的,

[
  [
    [1 1 1]
    [-1 1 -1]
    ...
 ]
 [
   [...]
   [...]
 ]
]
我试过这样做:

for sample in arr:
    for row in sample:
        print(np.where(np.greater(row, comp), 1, np.where(np.less(row, -comp), -1, 0)))
但这段代码将
comp
的完整数组与
arr[0][#]
a[1][#]
进行比较(或者)

我该怎么做呢

更新:

这样做对吗

for idx, sample in enumerate(arr):
    print(np.where(np.greater(sample, comp[idx]), 1, np.where(np.less(sample, -comp[idx]), -1, 0)))

进行比较(到-1,0,1)的常用方法是使用
np.sign

In [11]: np.sign(comp[0] - arr[0])
Out[11]:
array([[ 1,  1,  1],
       [-1,  1, -1],
       [-1,  1, -1],
       [-1,  1, -1]])
因此,这可以写成:

In [12]: np.array([np.sign(comp[i] - a) for i, a in enumerate(arr)])
Out[12]:
array([[[ 1,  1,  1],
        [-1,  1, -1],
        [-1,  1, -1],
        [-1,  1, -1]],

       [[-1, -1,  1],
        [-1,  1, -1],
        [-1, -1, -1],
        [-1, -1, -1]]])
可能有一个简单的方法来做“减法”在纯numpy。。。e、 g.使用np.repeat/tile使
comp
的大小与
arr
的大小相同(或某种巧妙的东西)

更新:感谢提供纯numpy解决方案:

In [13]: np.sign(comp[:,np.newaxis,:] - arr)
Out[13]:
array([[[ 1,  1,  1],
        [-1,  1, -1],
        [-1,  1, -1],
        [-1,  1, -1]],

       [[-1, -1,  1],
        [-1,  1, -1],
        [-1, -1, -1],
        [-1, -1, -1]]])
np.符号(comp[:,np.newaxis,:]-arr)
In [12]: np.array([np.sign(comp[i] - a) for i, a in enumerate(arr)])
Out[12]:
array([[[ 1,  1,  1],
        [-1,  1, -1],
        [-1,  1, -1],
        [-1,  1, -1]],

       [[-1, -1,  1],
        [-1,  1, -1],
        [-1, -1, -1],
        [-1, -1, -1]]])
In [13]: np.sign(comp[:,np.newaxis,:] - arr)
Out[13]:
array([[[ 1,  1,  1],
        [-1,  1, -1],
        [-1,  1, -1],
        [-1,  1, -1]],

       [[-1, -1,  1],
        [-1,  1, -1],
        [-1, -1, -1],
        [-1, -1, -1]]])