首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从2d数组中提取块

从2d数组中提取块
EN

Stack Overflow用户
提问于 2020-03-07 18:49:06
回答 3查看 305关注 0票数 3

假设您有一个以连续方式填充整数的2D数组,从左到右,从上到下。因此它看起来就像

代码语言:javascript
复制
[[ 0,  1,  2,  3,  4],
 [ 5,  6,  7,  8,  9],
 [10, 11, 12, 13, 14],
 [15, 16, 17, 18, 19]]

假设现在有一个一维数组,其中一些整数显示在上面的数组中。让我们假设这个数组是[6,7,11]。我想提取包含列表元素的2D数组的块/块。对于这两个输入,结果应该是

代码语言:javascript
复制
[[ 6.,  7.],
 [11., nan]]

(我正在用np.nan填充它是不能重塑的)

这就是我写的。有更简单的方法吗?

代码语言:javascript
复制
import numpy as np
def my_fun(my_list):
    ids_down = 4
    ids_across = 5
    layout = np.arange(ids_down * ids_across).reshape((ids_down, ids_across))

    ids = np.where((layout >= min(my_list)) & (layout <= max(my_list)), layout, np.nan)
    r,c = np.unravel_index(my_list, ids.shape)
    out = np.nan*np.ones(ids.shape)
    for i, t in enumerate(zip(r,c)):
        out[t] = my_list[i]

    ax1_mask = np.any(~np.isnan(out), axis=1)
    ax0_mask = np.any(~np.isnan(out), axis=0)
    out = out[ax1_mask, :]
    out = out[:, ax0_mask]

    return out

然后尝试my_fun([6,7,11])返回

代码语言:javascript
复制
[[ 6.,  7.],
 [11., nan]]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-03-07 19:09:39

这个100%的NumPy解决方案适用于连续的和非连续的想要的数字数组.

代码语言:javascript
复制
a = np.array([[ 0,  1,  2,  3,  4],
              [ 5,  6,  7,  8,  9],
              [10, 11, 12, 13, 14],
              [15, 16, 17, 18, 19]])
n = np.array([6, 7, 11])

确定通缉号码的位置:

代码语言:javascript
复制
mask = np.isin(a, n)

选择具有所需编号的行和列:

代码语言:javascript
复制
np.where(mask, a, np.nan)\
       [mask.any(axis=1)][:, mask.any(axis=0)]
#array([[ 6.,  7.],
#       [11., nan]])
票数 2
EN

Stack Overflow用户

发布于 2020-03-07 19:05:33

一种方法是通过检查数组中哪些元素包含在第二个列表中来查找包围盒。我们可以使用scipy.ndimage

代码语言:javascript
复制
from scipy import ndimage

m = np.isin(a, b)
a_components, _ = ndimage.measurements.label(m, np.ones((3, 3)))
bbox = ndimage.measurements.find_objects(a_components)
out = a[bbox[0]]
np.where(np.isin(out, b), out, np.nan)

array([[ 6.,  7.],
       [11., nan]])

设置-

代码语言:javascript
复制
a = np.array([[ 0,  1,  2,  3,  4],
              [ 5,  6,  7,  8,  9],
              [10, 11, 12, 13, 14],
              [15, 16, 17, 18, 19]])

b = np.array([6,7,11])

或者对于b = np.array([10,12,16]),我们可以得到:

代码语言:javascript
复制
m = np.isin(a, b)
a_components, _ = ndimage.measurements.label(m, np.ones((3, 3)))
bbox = ndimage.measurements.find_objects(a_components)
out = a[bbox[0]]
np.where(np.isin(out, b), out, np.nan)

array([[10., nan, 12.],
       [nan, 16., nan]])

我们还可以通过以下操作,对多个边界框进行上述调整:

代码语言:javascript
复制
b = np.array([5, 11, 8, 14])

m = np.isin(a, b)
a_components, _ = ndimage.measurements.label(m, np.ones((3, 3)))
bbox = ndimage.measurements.find_objects(a_components)

l = []
for box in bbox:
    out = a[box]
    l.append(np.where(np.isin(out, b), out, np.nan))

print(l)

[array([[ 5., nan],
        [nan, 11.]]), 
 array([[ 8., nan],
        [nan, 14.]])]
票数 2
EN

Stack Overflow用户

发布于 2020-03-07 19:21:08

利用模板数组A的特定形式,我们可以直接将测试值转换为坐标:

代码语言:javascript
复制
A = np.arange(20).reshape(4,5)
test = [6,7,11]

y,x = np.unravel_index(test,A.shape)
yl,yr = y.min(),y.max()
xl,xr = x.min(),x.max()
out = np.full((yr-yl+1,xr-xl+1),np.nan)
out[y-yl,x-xl]=test
out
# array([[ 6.,  7.],
#        [11., nan]])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60581065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档