python - 根据另一个数组更改列的值
问题描述
我有两个数组。
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 风格的技巧还有其他方法可以实现。
解决方案
您可以使用np.lexsort
来获取两者的间接排序(只是一个带有“排序索引”的一维数组)b
并z
匹配第二列和第三列,然后使用高级分配将第一列正确分配给相应的行。
尝试这个:
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]]
推荐阅读
- javascript - js序列化正确格式
- oracle - OSB 12c 的 Jdeveloper 中似乎没有导入的自定义 xpath 函数
- iis - 从 HTTP-Request/Response 对象中检索 IIS 日志参数值
- javascript - Meteor/SSR/Apollo 客户端 - 尝试使用 Apollo 设置 SSR 并没有找到 fetch
- php - 无法在 codeigniter 中按类别过滤数据
- reactjs - 如何在 ReactJS 中使表格可排序?
- amazon-web-services - AWS S3:React 失效请求的定价。托管在 S3 上的 Node.js 应用程序
- matplotlib - 在一个图中绘制 4 个子图时,set_xlabel 在 ax[0, 0] 中无效
- android - Android通过改进的API的大写第一个字符
- php - 如何修复“NULL 不是有效的 DataTable”。- Laravel Lavacharts