python矩阵删除全为0的行_python - 删除二维numpy数组中为0的正方形子矩阵 - 堆栈内存溢出...

本文介绍如何在Python中删除2D正方形数组中的全零块,使用NumPy和SciPy库进行操作。通过示例展示了如何创建一个大矩阵,找到非零块,并实现压缩和扩展矩阵到原始大小的过程。
摘要由CSDN通过智能技术生成

假设我有一个2D正方形数组,它是块对角矩阵大小(N,N)。 每个块是(例如)(N_b,N_b)。 这些块中的一些只是零(例如零的(N_b,N_b)矩阵)。 我想挤这些块被留下与不具有(N_B,N_B)0阵列的矩阵。

另外,我还想采用这些“压缩的”矩阵之一并将其扩展为原始大小(填充为零),要求所有元素都在同一位置

我能想到的一切都需要循环和大量的记账。 我很高兴使用稀疏矩阵,但这似乎使事情更加复杂。

问题的第一部分(“压缩”)可以通过以下方式完成:

import numpy as np

import scipy.sparse as sp

A = np.random.randn(3,3)*5

B = A*0.

M = np.array(sp.block_diag ( (A, B, A, A, A, B, A) ).todense())

n_b = A.shape[0]

n_blocks = M.shape[0]/n_b

block_locs = []

nonzero_blocks = []

for this_block in xrange ( n_blocks ):

if np.all(M[n_b*this_block:(this_block+1)*n_b, n_b*this_block:(this_block+1)*n_b] != 0):

nonzero_blocks.append (M[n_b*this_block:(this_block+1)*n_b, n_b*this_block:(this_block+1)*n_b] )

block_locs.append ( this_block )

squeezed_M = sp.block_diag ( nonzero_blocks ).tolil()

blocky = []

this_squeeze_block = 0

for this_block in xrange(n_blocks):

if this_block in block_locs:

blocky.append ( squeezed_M[this_squeeze_block*n_b:(this_squeeze_block+1)*n_b,

this_squeeze_block * n_b:(this_squeeze_block + 1) * n_b])

this_squeeze_block += 1

else:

blocky.append ( np.zeros((n_b, n_b)))

A_big = sp.block_diag(blocky).todense()

print np.allclose(M, A_big)

这是原始矩阵(顶部为零块)和压缩版本(底部)的图:

编辑利用问题的对称性的更简洁的方法可能是:

import numpy as np

import scipy.sparse as sp

import matplotlib.pyplot as plt

# First create a big matrix with gaps

n_b = 3

A = np.random.randn(n_b,n_b)*5

B = A*0.

M = sp.block_diag ( (A, B, A, A, A, B, A) )

# Select the rows which are not all zeros

no_zeros = np.any(np.array((M != 0).todense()), axis=1)

n_blocks = no_zeros.sum()

# where's the meat?

meat = np.outer ( no_zeros, no_zeros )

# We need to use a lil matrix to address by a boolean array

# And then we just reshape

A_squeeze = M.tolil()[meat].reshape((n_blocks, n_blocks))

reco = sp.lil_matrix ( M.shape)

reco[np.outer(no_zeros, no_zeros)]=A_squeeze.todense().ravel()

np.allclose(M.todense(), reco.todense())

plt.subplot(1,2,1)

plt.spy(M)

plt.subplot(1,2,2)

plt.spy(A_squeeze)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值