将numpy数组拆分为块

2024-10-01 07:36:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个900x6502dnumpy数组,我想把它分成10x10块,检查非零元素。有没有一种Python式的方法可以让我用纽比来达到这个目的?在

我正在寻找类似以下功能:

blocks_that_have_stuff = []
my_array = getArray()
my_array.cut_into_blocks((10, 10))
for block_no, block in enumerate(my_array):
    if numpy.count_nonzero(block) > 5:
        blocks_that_have_stuff.append(block_no)

Tags: 方法no目的功能元素thatmyhave
1条回答
网友
1楼 · 发布于 2024-10-01 07:36:13

我写了一个程序把你的矩阵切成块。这个例子很容易理解。我把它写在一个简单的形式,以显示结果(仅用于检查目的)。如果您对它感兴趣,可以在输出中包含块的数量或任何内容。在

import matplotlib.pyplot as plt
import numpy as np

def cut_array2d(array, shape):
    arr_shape = np.shape(array)
    xcut = np.linspace(0,arr_shape[0],shape[0]+1).astype(np.int)
    ycut = np.linspace(0,arr_shape[1],shape[1]+1).astype(np.int)
    blocks = [];    xextent = [];    yextent = []
    for i in range(shape[0]):
        for j in range(shape[1]):
            blocks.append(array[xcut[i]:xcut[i+1],ycut[j]:ycut[j+1]])
            xextent.append([xcut[i],xcut[i+1]])
            yextent.append([ycut[j],ycut[j+1]])
    return xextent,yextent,blocks

nx = 900; ny = 650
X, Y = np.meshgrid(np.linspace(-5,5,nx), np.linspace(-5,5,ny))
arr = X**2+Y**2

x,y,blocks = cut_array2d(arr,(10,10))

n = 0

for x,y,block in zip(x,y,blocks):
    n += 1
    plt.imshow(block,extent=[y[0],y[1],x[0],x[1]],
               interpolation='nearest',origin='lower',
               vmin = arr.min(), vmax=arr.max(),
               cmap=plt.cm.Blues_r)
    plt.text(0.5*(y[0]+y[1]),0.5*(x[0]+x[1]),str(n),
             horizontalalignment='center',
             verticalalignment='center')

plt.xlim([0,900])
plt.ylim([0,650])
plt.savefig("blocks.png",dpi=72)
plt.show()

输出为:

enter image description here

问候

注意:我想你可以用np.meshgrid公司而是用xextent和yextent添加了很多附录。在

相关问题 更多 >