python – numpy多维索引和对角线对称

python – numpy多维索引和对角线对称,第1张

概述我有一个非常大的numpy阵列…… power = ...print power.shape>>> (3, 10, 10, 19, 75, 10, 10) 这是对称的w.r.t. 10×10部分,即以下2-d矩阵是对称的 power[i, :, :, j, k, l, m]power[i, j, k, l, m, :, :] 对于i,j,k,l,m的所有值 我可以利用这个因子-4的增益吗?例 我有一个非常大的numpy阵列……

power = ...print power.shape>>> (3,10,19,75,10)

这是对称的w.r.t. 10×10部分,即以下2-d矩阵是对称的

power[i,:,j,k,l,m]power[i,m,:]

对于i,m的所有值

我可以利用这个因子-4的增益吗?例如.将矩阵保存到文件时(使用savez_compressed 50 mb)

我的尝试:

size = 10row_IDx,col_IDx = np.tril_indices(size)zip_IDx = zip(row_IDx,col_IDx)print len(zip_IDx),zip_IDx[:5]>>> 55 [(0,0),(1,1),(2,1)]all_IDx = [(r0,c0,r1,c1) for (r0,c0) in zip_IDx for (r1,c1) in zip_IDx]print len(all_IDx),all_IDx[:5]>>> 3025 [(0,(0,1,2,1)]a,b,c,d = zip(*all_IDx)tril_part = np.transpose(s.power,3,4,5,6))[:,a,d]print tril_part.shape>>> (3,3025)

这看起来很难看,但“有效”……一旦我也可以从tril_part恢复权力……

我想这会产生两个问题:

>从权力转向tril_part的更好方式?
>如何从tril_part转向权力?

编辑:“大小”评论显然是有效的,但请忽略它:-)恕我直言,问题的索引部分是独立的.我一直发现自己想要为较小的矩阵做类似的索引.

解决方法 你是在正确的道路上.使用np.tril_indices,您确实可以巧妙地索引这些较低的三角形.还有待改进的是数据的实际索引/切片.

请试试这个(复制和粘贴):

import numpy as npshape = (3,10)p = np.arange(np.prod(shape)).reshape(shape)  # this is not symmetric,but not importantix,iy = np.tril_indices(10)# In order to index properly,we need to add axes. This can be done by hand or with thisix1,ix2 = np.ix_(ix,ix)iy1,iy2 = np.ix_(iy,iy)p_ltriag = p[:,ix1,iy1,ix2,iy2]print p_ltriag.shape  # yIElds (55,55,75),axis order can be changed if neededq = np.zeros_like(p)q[:,iy2] = p_ltriag  # fills the lower triangles on both sIDesq[:,iy2,ix2] = p_ltriag  # fills the lower on left,upper on rightq[:,iy2] = p_ltriag  # fills the upper on left,lower on rightq[:,ix2] = p_ltriag  # fills the upper triangles on both sIDes

数组q现在包含p的对称化版本(其中上三角形被下三角形的内容替换).注意,最后一行包含反转顺序的iy和ix索引,实质上是创建下三角矩阵的转置.

下三角形的比较
为了比较,我们将所有上三角形设置为0

ux,uy = np.triu_indices(10)p[:,ux,uy] = 0q[:,uy] = 0p[:,uy] = 0print ((p - q) ** 2).sum()  # euclIDean distance is 0,so p and q are equalprint ((p ** 2).sum(),(q ** 2).sum())  # prove that not all entrIEs are 0 ;) - This has a negative result due to an overflow
总结

以上是内存溢出为你收集整理的python – numpy多维索引和对角线对称全部内容,希望文章能够帮你解决python – numpy多维索引和对角线对称所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1197078.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存