为何在NumPy矩阵中拼接字符串会出现截断现象?
字符串截断问题的原因与解决办法
问题原因
- numpy字符串数组的固定长度限制:你创建的
part1Vertices是numpy矩阵,默认会根据初始元素的长度自动设置字符串 dtype(比如初始元素"(a)"长度为3,dtype就是U3)。当你用np.char.add拼接更长的字符串时,结果会被强制截断到这个固定长度,这就是输出只显示前3个字符的核心原因。 - 代码逻辑错误:代码中引用了未定义的
aList和j,且没有正确将拼接结果赋值给part1Vertices,这部分逻辑完全失效,导致你看到的输出并非正确的拼接结果。
解决办法
方案1:修改numpy矩阵的字符串类型为可变长度
在创建矩阵时,指定足够容纳目标表达式的字符串 dtype(比如U100),同时修正赋值逻辑:
import numpy as np # 创建矩阵时显式指定长字符串类型 matrixA = np.matrix([ ['(1)', '(1/b)'], ['(-1/b)', '(1/b)'] ], dtype='U100') part1Vertices = np.matrix([ ['(a)', '(a)'], ['(a)', '(-a)'], ['(-a)', '(-a)'], ['(-a)', '(a)'], ['(a)', '(a)'] ], dtype='U100') print("Part 1 Original: ") print(part1Vertices) # 新建矩阵存储结果,避免原矩阵长度限制影响 updated_vertices = np.empty_like(part1Vertices, dtype='U100') for i in range(len(part1Vertices)): # 按矩阵乘法逻辑拼接字符串 col1 = f"{matrixA[0,0]}*{part1Vertices[i,0]}+{matrixA[0,1]}*{part1Vertices[i,1]}" col2 = f"{matrixA[1,0]}*{part1Vertices[i,0]}+{matrixA[1,1]}*{part1Vertices[i,1]}" updated_vertices[i, 0] = col1 updated_vertices[i, 1] = col2 print("\nPart 1 Updated: ") print(updated_vertices)
方案2:改用Python原生列表处理
如果不需要numpy的矩阵运算特性,直接用Python原生列表更灵活,完全没有字符串长度限制:
matrixA = [ ['(1)', '(1/b)'], ['(-1/b)', '(1/b)'] ] part1Vertices = [ ['(a)', '(a)'], ['(a)', '(-a)'], ['(-a)', '(-a)'], ['(-a)', '(a)'], ['(a)', '(a)'] ] print("Part 1 Original: ") for row in part1Vertices: print(row) updated_vertices = [] for x, y in part1Vertices: col1 = f"{matrixA[0][0]}*{x}+{matrixA[0][1]}*{y}" col2 = f"{matrixA[1][0]}*{x}+{matrixA[1][1]}*{y}" updated_vertices.append([col1, col2]) print("\nPart 1 Updated: ") for row in updated_vertices: print(row)
预期输出
两种方案均可输出你需要的结果:
Part 1 Original: [['(a)' '(a)'] ['(a)' '(-a)'] ['(-a)' '(-a)'] ['(-a)' '(a)'] ['(a)' '(a)']] Part 1 Updated: [['(1)*(a)+(1/b)*(a)' '(-1/b)*(a)+(1/b)*(a)'] ['(1)*(a)+(1/b)*(-a)' '(-1/b)*(a)+(1/b)*(-a)'] ['(1)*(-a)+(1/b)*(-a)' '(-1/b)*(-a)+(1/b)*(-a)'] ['(1)*(-a)+(1/b)*(a)' '(-1/b)*(-a)+(1/b)*(a)'] ['(1)*(a)+(1/b)*(a)' '(-1/b)*(a)+(1/b)*(a)']]
内容的提问来源于stack exchange,提问作者Samuel W
相关产品推荐
相关产品推荐

