在python中使用numpy reshape作为多维数组中的列专业

时间:2015-08-14 15:02:35

标签: python arrays numpy

我正在尝试将字符串转换为n维的numpy数组(x,4,4)。基本要求是4x4数组,其中列主要填充值。我们将根据输入字符串的长度使用尽可能多的4x4数组。例如,如果我的字符串是:

'快速的棕色狐狸跳过狗'

结果数组应如下所示:

[[['A' 'i' 'b' 'n']
  [' ' 'c' 'r' ' ']
  ['q' 'k' 'o' 'f']
  ['u' ' ' 'w' 'o']]

 [['x' 'm' 'o' ' ']
  [' ' 'p' 'v' 'd']
  ['j' 's' 'e' 'o']
  ['u' ' ' 'r' 'g']]]

请注意,代替传统的行首先填充值,要求填充在4x4子阵列中首先是列。

我理解用于实现此目的的传统代码将类似于下面的三嵌套循环:

string = 'A quick brown fox jumps over dog'
dim1 = len(string) // 16
matrix1 = np.empty((dim1, 4, 4), str)
position = 0
for z in range(dim1):
    for y in range(4):
        for x in range(4):
            matrix1[z, x, y] = string[position]
            position += 1
print(matrix1)

我想使用Python的功能,所以经过一些研究后我发现了以下方法:

string = 'A quick brown fox jumps over dog'
dim1 = len(string) // 16
matrix2 = np.array(list(string))
matrix2 = np.reshape(matrix2, (dim1, 4, 4))

但是当我进行重塑时,它会给我以下输出:

[[['A' ' ' 'q' 'u']
  ['i' 'c' 'k' ' ']
  ['b' 'r' 'o' 'w']
  ['n' ' ' 'f' 'o']]

 [['x' ' ' 'j' 'u']
  ['m' 'p' ' ' 'o']
  ['v' 'e' 'r' ' ']
  ['d' 'o' 'g' 's']]]

逐行完成字符串。我希望它在sub(4x4)数组中逐列,然后转到下一个(4x4)数组。

进一步的研究表明,我可以使用swapaxes函数来实现这一点,如下所示:

matrix2 = np.swapaxes(matrix2, 1, 2)

上面给出了我想要的结果。

所以,我的最终代码变成了:

string = 'A quick brown fox jumps over dog'
dim1 = len(string) // 16
matrix2 = np.array(list(string))
matrix2 = np.reshape(matrix2, (dim1, 4, 4))
matrix2 = np.swapaxes(matrix2, 1, 2)
print(matrix2)

如果有办法使用单一方法/功能实现重塑和交换,只需要您的专家意见。或者,如果没有使用循环或没有使用这么多函数,那么有一个更好,更方便的方法。

1 个答案:

答案 0 :(得分:2)

不是单一的方法/功能,但你可以在单行中执行此操作:

matrix2 = np.array(list(string)).reshape(dim1,4,4).swapaxes(1,2)

给出:

array([[['A', 'i', 'b', 'n'],
        [' ', 'c', 'r', ' '],
        ['q', 'k', 'o', 'f'],
        ['u', ' ', 'w', 'o']],

       [['x', 'm', 'o', ' '],
        [' ', 'p', 'v', 'd'],
        ['j', 's', 'e', 'o'],
        ['u', ' ', 'r', 'g']]], 
      dtype='|S1')