python - 如何通过随机选择 2x2 子数组中的元素来下采样 2D 数组?
问题描述
我有一个2n x 2m的numpy 数组。我想通过在划分我的初始数组的2 x 2非重叠子数组中随机选择一个元素来形成一个nxm数组。最好的方法是什么?有没有办法避免两个for循环(每个维度一个)?
例如,如果我的数组是
1 2 3 4
5 6 7 8
9 0 1 2
8 5 7 0
然后,有四个2 x 2子阵列对其进行分区:
1 2 3 4
5 6 7 8
9 0 1 2
8 5 7 0
我想在每个元素中随机选取一个元素来形成新的数组,例如
5 3 , 6 8 , 2 3
9 2 9 1 0 0 .
感谢您的时间。
解决方案
这可以通过抽样来完成。我们不是对每个 2x2 正方形进行采样,而是将整个 ndarray 采样到 4 个单独的 ndarray 中,其中这些子数组中的相同索引将指向同一个 2x2 正方形。然后我们从这 4 个单独的 ndarray 中随机抽样:
# create test dataset
test = np.arange(36).reshape(6,6)
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])
# Create subsamples from ndarray
samples = np.array([test[::2, ::2], test[1::2, 1::2], test[::2, 1::2], test[1::2, ::2]])
>>> samples
array([[[ 0, 2, 4],
[12, 14, 16],
[24, 26, 28]],
[[ 7, 9, 11],
[19, 21, 23],
[31, 33, 35]],
[[ 1, 3, 5],
[13, 15, 17],
[25, 27, 29]],
[[ 6, 8, 10],
[18, 20, 22],
[30, 32, 34]]])
现在,这 4 个子样本中的每一个的相同索引都指向原始 ndarray 上的相同 2x2 正方形。我们只需要从同一个索引中随机选择:
# Random choice sampling between these 4 subsamples.
select = np.random.randint(4,size=(3,3))
>>> select
array([[2, 2, 1],
[3, 1, 1],
[3, 0, 0]])
result = select.choose(samples)
>>> result
array([[ 1, 3, 11],
[18, 21, 23],
[30, 26, 28]])
推荐阅读
- javascript - 电子应用程序中未定义require
- django - Django Google App Engine:502 Bad Gateway,已安装的包无法识别
- javascript - 通过 JavaScript / JQuery 中对象属性的数组索引对对象数组的所有值求和
- javascript - 单击父项以在集合中打开它的子项(香草 JS)
- azure - 用户、组或应用程序没有秘密获得密钥保管库的权限
- ubuntu - 错误:“~ubuntugis”用户或团队不存在
- appium - 尝试在 Android 虚拟设备上运行 reddit 应用程序后出现 ADB 超时错误
- flutter - 如果由于另一个对象保留对此 State 对象的引用而调用 setState(),则此错误可能表示内存泄漏
- mysql - 错误代码:1366。不正确的整数值:第 2 行的列“ReportsTo”的“NULL”
- php - WordPress仪表板显示为一些编码文本