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。
答案 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]]