Python Numpy.select from 3D array
假设我有以下numpy数组:Python Numpy.select from 3D array,python,numpy,iteration,Python,Numpy,Iteration,假设我有以下numpy数组: >>a array([[0, 0, 2], [2, 0, 1], [2, 2, 1]]) >>b array([[2, 2, 0], [2, 0, 2], [1, 1, 2]]) 然后垂直堆叠 c=np.dstack((a,b)) 导致: >>c array([[[0, 2], [0, 2], [2, 0]], [[2, 2
>>a
array([[0, 0, 2],
[2, 0, 1],
[2, 2, 1]])
>>b
array([[2, 2, 0],
[2, 0, 2],
[1, 1, 2]])
然后垂直堆叠
c=np.dstack((a,b))
导致:
>>c
array([[[0, 2],
[0, 2],
[2, 0]],
[[2, 2],
[0, 0],
[1, 2]],
[[2, 1],
[2, 1],
[1, 2]]])
由此,我希望,对于c的每个第三维,检查该子数组中存在哪个组合,然后根据列表匹配的索引对其进行编号。我试过以下方法,但不起作用。该算法非常简单,具有双for循环,但由于c非常大,因此速度非常慢
classes=[(0,0),(2,1),(2,2)]
out=np.select( [h==c for h in classes], range(len(classes)), default=-1)
我期望的输出是
out = [[-1,-1,-1],
[3, 1,-1],
[2, 2,-1]]
这个怎么样:
(np.array([np.array(h)[...,:] == c for h in classes]).all(axis = -1) *
(2 + np.arange(len(classes)))[:, None, None]).max(axis=0) - 1
它返回你真正需要的东西
array([[-1, -1, -1],
[ 3, 1, -1],
[ 2, 2, -1]])
这个怎么样:
(np.array([np.array(h)[...,:] == c for h in classes]).all(axis = -1) *
(2 + np.arange(len(classes)))[:, None, None]).max(axis=0) - 1
它返回你真正需要的东西
array([[-1, -1, -1],
[ 3, 1, -1],
[ 2, 2, -1]])
您可以像下面这样分别测试a和b阵列:
clsa = (0,2,2)
clesb = (0,1,2)
np.select ( [(ca==a) & (cb==b) for ca,cb in zip (clsa, clsb)], range (3), default = -1)
它会得到您想要的结果(除了返回0,1,2而不是1,2,3)。您可以像这样分别测试a和b阵列:
clsa = (0,2,2)
clesb = (0,1,2)
np.select ( [(ca==a) & (cb==b) for ca,cb in zip (clsa, clsb)], range (3), default = -1)
它会得到你想要的结果(除了返回0,1,2而不是1,2,3)。这里是另一种获得你想要的结果的方法,我想我会发布它,以防它对任何人都有用
import numpy as np
a = np.array([[0, 0, 2],
[2, 0, 1],
[2, 2, 1]])
b = np.array([[2, 2, 0],
[2, 0, 2],
[1, 1, 2]])
classes=[(0,0),(2,1),(2,2)]
c = np.empty(a.shape, dtype=[('a', a.dtype), ('b', b.dtype)])
c['a'] = a
c['b'] = b
classes = np.array(classes, dtype=c.dtype)
classes.sort()
out = classes.searchsorted(c)
out = np.where(c == classes[out], out+1, -1)
print out
#array([[-1, -1, -1]
# [ 3, 1, -1]
# [ 2, 1, -1]])
这是另一种获得你想要的东西的方法,我想我会把它贴出来,以防它对任何人都有用
import numpy as np
a = np.array([[0, 0, 2],
[2, 0, 1],
[2, 2, 1]])
b = np.array([[2, 2, 0],
[2, 0, 2],
[1, 1, 2]])
classes=[(0,0),(2,1),(2,2)]
c = np.empty(a.shape, dtype=[('a', a.dtype), ('b', b.dtype)])
c['a'] = a
c['b'] = b
classes = np.array(classes, dtype=c.dtype)
classes.sort()
out = classes.searchsorted(c)
out = np.where(c == classes[out], out+1, -1)
print out
#array([[-1, -1, -1]
# [ 3, 1, -1]
# [ 2, 1, -1]])
这看起来有我需要的灵活性。谢谢这看起来有我需要的灵活性。谢谢不是我所需要的灵活性,但很高兴能以不同的方式学习。谢谢不是我所需要的灵活性,但很高兴能以不同的方式学习。谢谢