Python 根据另一个数组更改列的值
我有两个数组Python 根据另一个数组更改列的值,python,arrays,numpy,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
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
)相同
例如,由于第一行的第二(1
)和第三个值(1
)与第二行的z
([0 1 1]
)相同,因此b
([0 1 1]
)的第一行([1
)将更改为([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风格的技巧还有其他实现方法。使用for循环的解决方案:
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]])
print(b)
print("="*50)
for row in b:
for r in z:
if row[-1] == r[-1] and row[-2] == r[-2]:
row[0] = r[0]
print(b)
您可以使用来获得b
和z
的间接排序(仅是带有“排序索引”的一维数组),以匹配第二列和第三列,然后使用高级分配将第一列正确分配给相应的行
试试这个:
将numpy导入为np
b=np.数组([-2,1,1]、-99,1,0]、-12,0,1]、-100,0,0])
z=np.数组([[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]
印刷品(b)
输出(与您的相同):
你可以做:
ix=[np.argmax((z[:,1::==b_u[1:])。所有(axis=1))用于b中的b]
b[:,0]=z[:,0][ix]
印刷品(b)
[[0 1]
[ 2 1 0]
[-1 0 1]
[ 0 0 0]]
到目前为止,您尝试了什么?
[[ 0 1 1]
[ 2 1 0]
[-1 0 1]
[ 0 0 0]]