首页 > 解决方案 > 根据另一个数组更改列的值

问题描述

我有两个数组。

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) 的第二行相同。但是,我想保持. 所以,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 风格的技巧还有其他方法可以实现。

标签: pythonarraysnumpy

解决方案


您可以使用np.lexsort来获取两者的间接排序(只是一个带有“排序索引”的一维数组)bz匹配第二列和第三列,然后使用高级分配将第一列正确分配给相应的行。

尝试这个:

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]]

推荐阅读