我有两个数组。
b = np.array([[-2,1,1],[-99,1,0],[-12,0,1],[-100,0,0]])
z = np.array([[0,0,0],[0,1,1],[2,1,0],[-1,0,1]])
print(b)
[[ -2 1 1]
[ -99 1 0]
[ -12 0 1]
[-100 0 0]]
print(z)
[[ 0 0 0]
[ 0 1 1]
[ 2 1 0]
[-1 0 1]]
我要更改的是第一个数组([-2, -99, -12, -100]
)的第一列(b
)的值。更具体地说,应根据与另一个数组(z
)相同的第二列和第三列进行更改。
例如,b
([ -2 1 1]
)的第一行将更改为([ 0 1 1]
,因为第二(1
)和第三个值({{1第一行的}}}与1
(z
)的第二行相同。但是,我想保留[0 1 1]
中的行顺序。因此,
z
使用循环似乎是不可避免的,但我希望 Numpy样式技巧还有其他实现方法。
答案 0 :(得分:1)
您可以使用np.lexsort
获取b
和z
的间接排序(仅是带有“排序索引”的一维数组)以匹配第二列和第三列,然后使用高级分配将第一列正确分配给相应的行。
尝试一下:
import numpy as np
b = np.array([[-2, 1, 1], [-99, 1, 0], [-12, 0, 1], [-100, 0, 0]])
z = np.array([[0, 0, 0], [0, 1, 1], [2, 1, 0], [-1, 0, 1]])
b_argsorted = np.lexsort((b[:, 1], b[:, 2]))
z_argsorted = np.lexsort((z[:, 1], z[:, 2]))
b[b_argsorted, 0] = z[z_argsorted, 0]
print(b)
输出(与您的输出相同)
[[ 0 1 1]
[ 2 1 0]
[-1 0 1]
[ 0 0 0]]
答案 1 :(得分:1)
您可以做到:
BufferedImage
ix = [np.argmax((z[:,1:] == b_[1:]).all(axis = 1)) for b_ in b]
b[:,0] = z[:,0][ix]
print(b)
答案 2 :(得分:0)
使用for循环的解决方案:
year