Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据另一个数组更改列的值_Python_Arrays_Numpy - Fatal编程技术网

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