根据另一个数组更改列的值

时间:2019-08-01 11:17:38

标签: python arrays numpy

我有两个数组。

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第一行的}}}与1z)的第二行相同。但是,我想保留[0 1 1]中的行顺序。因此,

z

使用循环似乎是不可避免的,但我希望 Numpy样式技巧还有其他实现方法。

3 个答案:

答案 0 :(得分:1)

您可以使用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]]

答案 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