我正在尝试将字符串转换为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)
如果有办法使用单一方法/功能实现重塑和交换,只需要您的专家意见。或者,如果没有使用循环或没有使用这么多函数,那么有一个更好,更方便的方法。
答案 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')