python - 不理解这个 IndexError 使用 numpy
问题描述
我得到一个二次矩阵,必须执行以下操作:
For each entry (i,j) in the matrix
If i = j:
set y[i,j] = x[i,j].
Else:
set y[i,j] = x[i,j] + x[j,i]
我制作了以下脚本:
def symmetrize(x):
## The symmetrized matrix that is returned
y = np.zeros(np.shape(x))
## For loop for each element (i,j) in the matrix
for i in range (np.size(x)):
for j in range (np.size(x)):
if i == j:
y[i,j] = x[i,j]
else:
y[i,j] = x[i,j] + x[j,i]
return y
每当我想使用以下矩阵运行代码时,都会收到此错误消息:
np.array([[1.2, 2.3, 3.4],[4.5, 5.6, 6.7], [7.8, 8.9, 10.0]])
错误信息:
y[i,j] = x[i,j] + x[j,i]
IndexError: index 3 is out of bounds for axis 1 with size 3
有人知道问题是什么吗?
解决方案
np.size()
,没有轴,为您提供矩阵中元素的总数。所以你range()
的 s 将从 0 到 8,而不是从 0 到 2。
你不需要使用np.size()
or np.shape()
;这些功能甚至不再在文档中列出。只需使用.shape
矩阵的属性:
y = np.zeros(x.shape)
for i in range(x.shape[0]):
for j in range(x.shape[1]):
有更好的方法来产生你的输出。你可以使用:
def symmetrize(x):
return x + x.T - np.diag(x.diagonal())
反而。x.T
是转置矩阵,所以行和列交换了。x + x.T
是原始矩阵和转置矩阵的和,所以对角线上的数字加倍。x.diagonal()
是对角线上的那些数字的数组,一旦你在对角线上创建了这些数字的矩阵,就可以减去它,这np.diag()
对你有用。
推荐阅读
- java - java - 如何在一行中在java中的一行中将内容从一个文件复制到另一个文件
- http - 如何修复go中的错误:http2:客户端连接不可用
- linux - glibc 的 syscalls.list 中的 Caller 列是什么意思?
- azure - 当 DB 具有“连续”备份策略时,无法更新 Cosmos DB 容器
- python - 使用 TPU 时图张量泄漏
- sharepoint - 如何将 SharePoint 文件附件添加到 Microsoft Dynamics CRM 电子邮件实体页面
- python - 对数据框进行永久性更改
- makefile - 链接器错误说未定义对 `my_function` 的引用
- javascript - JS - 比较具有附加 ID 的对象
- sql - 以编程方式自动调整连续表单域的大小