为了账号安全,请及时绑定邮箱和手机立即绑定

由多个较小的2D阵列组成一个大2D阵列

由多个较小的2D阵列组成一个大2D阵列

aluckdog 2021-03-12 16:10:27
问题是这个问题的反面。我正在寻找一种通用方法来从小数组中将原始的大数组中提取出来:array([[[ 0,  1,  2],        [ 6,  7,  8]],           [[ 3,  4,  5],        [ 9, 10, 11]],        [[12, 13, 14],        [18, 19, 20]],           [[15, 16, 17],        [21, 22, 23]]])->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]])我目前正在开发一个解决方案,将在完成后发布,但是希望看到其他(更好)的方法。
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

import numpy as np

def blockshaped(arr, nrows, ncols):

    """

    Return an array of shape (n, nrows, ncols) where

    n * nrows * ncols = arr.size


    If arr is a 2D array, the returned array looks like n subblocks with

    each subblock preserving the "physical" layout of arr.

    """

    h, w = arr.shape

    return (arr.reshape(h//nrows, nrows, -1, ncols)

               .swapaxes(1,2)

               .reshape(-1, nrows, ncols))



def unblockshaped(arr, h, w):

    """

    Return an array of shape (h, w) where

    h * w = arr.size


    If arr is of shape (n, nrows, ncols), n sublocks of shape (nrows, ncols),

    then the returned array preserves the "physical" layout of the sublocks.

    """

    n, nrows, ncols = arr.shape

    return (arr.reshape(h//nrows, -1, nrows, ncols)

               .swapaxes(1,2)

               .reshape(h, w))

例如,


c = np.arange(24).reshape((4,6))

print(c)

# [[ 0  1  2  3  4  5]

#  [ 6  7  8  9 10 11]

#  [12 13 14 15 16 17]

#  [18 19 20 21 22 23]]


print(blockshaped(c, 2, 3))

# [[[ 0  1  2]

#   [ 6  7  8]]


#  [[ 3  4  5]

#   [ 9 10 11]]


#  [[12 13 14]

#   [18 19 20]]


#  [[15 16 17]

#   [21 22 23]]]


print(unblockshaped(blockshaped(c, 2, 3), 4, 6))

# [[ 0  1  2  3  4  5]

#  [ 6  7  8  9 10 11]

#  [12 13 14 15 16 17]

#  [18 19 20 21 22 23]]

它以不同的格式(使用更多的轴)排列块,但是它的优点是(1)始终返回视图,并且(2)能够处理任何尺寸的数组。


查看完整回答
反对 回复 2021-03-29
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

另一种(简单的)方法:


threedarray = ...

twodarray = np.array(map(lambda x: x.flatten(), threedarray))

print(twodarray.shape)


查看完整回答
反对 回复 2021-03-29
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

希望我对你说得对,假设我们有a,b:


>>> a = np.array([[1,2] ,[3,4]])

>>> b = np.array([[5,6] ,[7,8]])

    >>> a

    array([[1, 2],

           [3, 4]])

    >>> b

    array([[5, 6],

           [7, 8]])

为了使其成为一个大的二维数组,请使用numpy.concatenate:


>>> c = np.concatenate((a,b), axis=1 )

>>> c

array([[1, 2, 5, 6],

       [3, 4, 7, 8]])


查看完整回答
反对 回复 2021-03-29
  • 3 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信