numpy 在四维数组中循环前两个索引?

ccrfmcuu  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(72)

我有一个np.数组,它的维数是478,533,3,3(变量名为“window”,使用NumPy步幅技巧从更大的2D数组中滑动窗口生成)。数组的478 x535部分基本上是3x 3数组的数组。我感兴趣的是迭代所有3x 3数组以获得值我尝试过各种循环组合,但似乎找不到一个“for”循环来遍历每个3x 3数组。

window = np.lib.stride_tricks.sliding_window_view(tiff_array, (3,3))
P11 = np.zeros([3,3])

for i,j in window:
    block = window[i,j,:,:]
    if block[1,1]==1:
        if block[1,1]-1==1 and block[1,1]-1==1:
            P11[0,0]=P11[0,0]+1

字符串
这是我在各种尝试中尝试过的一些快速代码。我继续得到错误“有太多的值要解包”,并且应该有两个值(我想是i,j)。我知道有两个以上的值,这就是为什么我试图在每个3x 3数组块上进行解包。我想我错过了一些明显的东西,但希望得到一些帮助。TIA!

izkcnapc

izkcnapc1#

您的方法适用于以下更改:

window = np.lib.stride_tricks.sliding_window_view(tiff_array, (3,3))
P11 = np.zeros([3,3])

for block in window.reshape(-1, 3, 3):
    if block[1,1]==1:
        if block[1,1]-1==1 and block[1,1]-1==1:
            P11[0,0]=P11[0,0]+1

字符串
我不知道你真正需要做什么,但这种风格的矢量化方法通常更好:

t11 = tiff_array[1:-1, 1:-1]
ones = t11 == 1
P11[0, 0] = ones.sum()
...


t11只是原始数组的一个视图,所以它不会占用额外的内存。

ycggw6v2

ycggw6v22#

对于较小的起始数组:

In [17]: arr = np.random.randint(1,4,(6,6))    
In [18]: arr
Out[18]: 
array([[1, 1, 2, 2, 2, 1],
       [3, 2, 3, 2, 1, 1],
       [2, 2, 3, 3, 1, 1],
       [1, 2, 3, 3, 1, 1],
       [3, 2, 3, 2, 3, 1],
       [1, 3, 2, 1, 2, 1]])

In [19]: window = np.lib.stride_tricks.sliding_window_view(arr, (3,3))    
In [20]: window.shape
Out[20]: (4, 4, 3, 3)

字符串
各中心:

In [21]: window[:,:,1,1]
Out[21]: 
array([[2, 3, 2, 1],
       [2, 3, 3, 1],
       [2, 3, 3, 1],
       [2, 3, 2, 3]])


计算它们很容易:

In [22]: (window[:,:,1,1]==1).sum()
Out[22]: 3


正如我所说,我不知道你在总结什么。
但是让我们猜一猜,至少看看在块上迭代应该如何工作:

In [26]: P=np.zeros((3,3),int)
In [27]: for i in range(window.shape[0]):
    ...:     for j in range(window.shape[1]):
    ...:         block = window[i,j]
    ...:         if block[1,1]==1:
    ...:             print(block[0,1],block[2,1])
    ...:             P += block
    ...:             
2 1
1 1
1 3

In [28]: P
Out[28]: 
array([[7, 4, 3],
       [8, 3, 3],
       [8, 5, 3]])


眯着眼往旁边看,我几乎可以想象

if block[1,1]==1:
    if block[1,1]-1==1 and block[1,1]-1==1:


只是意味

block[1,1]==1 and block[1,0]==1 and block[1,2]==1
(block[1,:]==1).all()


也就是说,每个块的整行都是1

In [66]: P=np.zeros((3,3),int)
    ...: for i in range(window.shape[0]):
    ...:     for j in range(window.shape[1]):
    ...:         block = window[i,j]
    ...:         if (block[1,:]==1).all():
    ...:             P[:] += block
    ...: P            
Out[66]: 
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])


在我的小样本中,没有任何大小为3的1序列。

相关问题