假设我们有两个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 = np.array([
[2, 20, 4],
[3, 8, 15]
])
我试图将comp
的每个1D数组与arr
的二维数组(行方式)进行比较,即
[2, 20, 4] > [1, 2, 3] = [1 1 1]
如果下一行不满足条件,则取消comp
,然后比较它:
[-2, 20, -4], [4, 5, 6] = [-1 1 -1]
如果没有别的东西可以放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)))
答案 0 :(得分:2)
进行比较(到-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 ...例如使用np.repeat / tile为comp
提供与arr
相同的大小(或一些聪明的东西)!
更新:感谢@flippo提供纯粹的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]]])