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

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

我想要更改的是第一个数组(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获得 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]]

关于python - 根据另一个数组更改列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57307838/

相关文章:

python - 矩阵和向量之间的欧氏距离

python - 跳棋算法 : how to reduce nested for loops

python - 在 psycopg2 中使用 with 语句创建事务

Javascript如何将数组中的第一个元素与其他元素进行比较

numpy - 在另一个更大的数组中插入 3D 数组的值的最佳方法

Python 和 matplotlib 以及 Arduino

python - numpy如何加载具有整数的元组列表

Python Date 两个日期之间的中间值

javascript - 使用字符串中的键/值对创建对象?

arrays - 将元素从一个数组传递到另一个数组,生成 CSV