替换numpy数组中的对角线元素

如何解决替换numpy数组中的对角线元素

如果我想在对角线上方创建一个值为 10、20、30、40 的 5x5 零矩阵,我可以执行以下操作:

import numpy as np
np.diag((1+np.arange(4))*10,k=1)

但是如何用相同的数组 10,20,30,40 替换 5x5 随机矩阵中对角线上方的元素?我尝试使用 numpy where 函数,它适用于一维数组,例如:

import numpy as np
array1 = np.array([2,2,2])
print np.where(array1==0,1,array1) 

但我不能让它在更高的维度上工作。我可以手动分配值,但我正在寻找更好的解决方案。

解决方法

您可以尝试预先索引:

a = np.arange(25).reshape(5,5)

s = np.arange(len(a))
a[s[:-1],s[1:]] = [10,20,30,40]

输出:

array([[ 0,10,2,3,4],[ 5,6,8,9],[10,11,12,14],[15,16,17,18,40],[20,21,22,23,24]])
,

也许这行得通。例如,对于这个数组:

arr = np.random.rand(5,5)
print(arr)

[[0.63267449 0.81436882 0.49014052 0.85241815 0.39175126]
 [0.79926876 0.46784356 0.64146423 0.24392249 0.70449611]
 [0.28667995 0.58503395 0.80665148 0.84331471 0.10687276]
 [0.59349235 0.23448985 0.25971096 0.60335227 0.31760505]
 [0.10723313 0.44694671 0.99660858 0.31529209 0.42713487]]


使用 np.diag(arr,k=1) 可以得到主对角线上方的对角线。

diag = np.diag(arr,k=1)

您可以使用 diag 获取 np.isin(...) 中元素的索引,然后将这些条目替换为 [10,40 ]。

idxs = np.isin(arr,diag).nonzero()
arr[idxs] = np.array([10,40 ],dtype = np.float)
arr

array([[ 0.63267449,10.,0.49014052,0.85241815,0.39175126],[ 0.79926876,0.46784356,20.,0.24392249,0.70449611],[ 0.28667995,0.58503395,0.80665148,30.,0.10687276],[ 0.59349235,0.23448985,0.25971096,0.60335227,40.        ],[ 0.10723313,0.44694671,0.99660858,0.31529209,0.42713487]])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?