我有两个数组。
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]]
我想要更改的是第一个数组(b
)的第一列([-2, -99, -12, -100]
)的值)。更具体地说,这些应该根据与另一个数组 (z
) 相同的第二列和第三列进行更改。
例如,b
的第一行 ([ -2 1 1]
) 将更改为 ([ 0 1 1]
)因为第一行的第二个(1
)和第三个值(1
)与z
的第二行相同([ 0 1 1]
)。但是,我想保留 z
中的行顺序。因此,
# b
[[ -2 1 1]
[ -99 1 0]
[ -12 0 1]
[-100 0 0]]
# would be ..
[[ 0 1 1]
[ 2 1 0]
[ -1 0 1]
[ 0 0 0]]
使用循环似乎是不可避免的,但我希望还有其他方法可以通过Numpy 风格技巧来实现。
最佳答案
您可以使用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]]
关于python - 根据另一个数组更改列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57307838/