如何在更大的数组中找到numpy数组形状?

时间:2018-11-30 02:41:05

标签: python numpy

big_array = np.array((
  [0,1,0,0,1,0,0,1],
  [0,1,0,0,0,0,0,0],
  [0,1,0,0,1,0,0,0], 
  [0,0,0,0,1,0,0,0],
  [1,0,0,0,1,0,0,0]))

print(big_array)
[[0 1 0 0 1 0 0 1]
 [0 1 0 0 0 0 0 0]
 [0 1 0 0 1 0 0 0]
 [0 0 0 0 1 0 0 0]
 [1 0 0 0 1 0 0 0]]

是否有一种方法可以遍历这个numpy数组,并且对于每个2x2的0簇,将该簇内的所有值设置为5?这就是输出的样子。

[[0 1 5 5 1 5 5 1]
 [0 1 5 5 0 5 5 0]
 [0 1 5 5 1 5 5 0]
 [0 0 5 5 1 5 5 0]
 [1 0 5 5 1 5 5 0]]

我的想法是使用高级索引将2x2 shape =设置为5,但是我认为简单地像这样迭代会非常慢: 1)检查array [x] [y]是否为0 2)检查相邻数组元素是否为0 3)如果所有元素均为0,则将所有这些值设置为5。

3 个答案:

答案 0 :(得分:0)

df %>% select(-date) %>% distinct()

输出: [1、7、5、5、3]

这是一个示例,并非完整的正确代码。

答案 1 :(得分:0)

这是将数组视为块的解决方案。

首先,您需要在此处https://gist.github.com/seberg/3866040/revisions定义此功能rolling_window

然后使用此功能将起始数组big分成2x2块。 还要生成一个数组,其中每个元素的索引都很大,然后将其类似地分成2x2的块。

然后生成一个布尔掩码,其中2x2个big块全为零,并使用索引数组获取这些元素。

blks = rolling_window(big,window=(2,2)) # 2x2 blocks of original array
inds = np.indices(big.shape).transpose(1,2,0) # array of indices into big 
blkinds = rolling_window(inds,window=(2,2,0)).transpose(0,1,4,3,2) # 2x2 blocks of indices into big 

mask = blks == np.zeros((2,2)) # generate a mask of every 2x2 block which is all zero 
mask = mask.reshape(*mask.shape[:-2],-1).all(-1) # still generating the mask 


# now blks[mask] is every block which is zero..
# but you actually want the original indices in the array 'big' instead

inds = blkinds[mask].reshape(-1,2).T # indices into big where elements need replacing 
big[inds[0],inds[1]] = 5 #reassign 

您需要测试一下:我没有。但是,想法是将数组分为块,将索引数组分成块,然后在块上建立布尔条件,使用这些条件获取索引,然后重新分配。

另一种选择是迭代此处定义的indblks,然后测试从每个indblk元素的big获得的2x2,并在必要时重新分配。

答案 2 :(得分:0)

这是我试图帮助您解决问题的尝试。我的解决方案可能会受到公平的批评。

import numpy as np
from itertools import product
m = np.array((
  [0,1,0,0,1,0,0,1],
  [0,1,0,0,0,0,0,0],
  [0,1,0,0,1,0,0,0],
  [0,0,0,0,1,0,0,0],
  [1,0,0,0,1,0,0,0]))
h = 2
w = 2
rr, cc = tuple(d + 1 - q for d, q in zip(m.shape, (h, w)))
slices = [(slice(r, r + h), slice(c, c + w))
          for r, c in product(range(rr), range(cc))
          if not m[r:r + h, c:c + w].any()]
for s in slices:
    m[s] = 5
print(m)

[[0 1 5 5 1 5 5 1]
 [0 1 5 5 0 5 5 5]
 [0 1 5 5 1 5 5 5]
 [0 5 5 5 1 5 5 5]
 [1 5 5 5 1 5 5 5]]