我有一个文本小部件,用户必须在其中以以下形式输入输入:
a 1 b 2 c 3
d 4 e 5 f 6
g 7 h 8 i 9
我想把这个输入转换成一个数组(ndarray(的数组,其中每一行都是一个数组,我可以在其中单独获得每个项目:
[1 2 3], [4 5 6], [7 8 9]
到目前为止我尝试了什么:
这些字符对以后使用很重要,但现在我只需要数字。我设法将输入保存为一个数组,并从中获得另一个只包含数字的数组。然后我需要的是将输入切成一定的等份(在本例中为三份(。我发现可以使用np.split
函数,但必须先将数组转换为整数或1D数组。
我知道,在整数的情况下,我可以使用processed_input_3 = np.split(processed_input_2, [3])
,列表被分成三个相等的部分(正如我所理解的那样,得到一个ndarray(。在1D阵列的情况下,列表根据某个轴进行分离。
当我将输入输入到文本窗口小部件中并点击";Go"-则程序返回[array([1, 2, 3]), array([4, 5, 6, 7, 8, 9])]
。这看起来像是我创建了一个1D数组,而不是一个整数。我的问题是,我既不理解整数和1D数组之间的区别,也不理解1D数组中轴的概念。
import tkinter as tk
import numpy as np
root = tk.Tk()
processed_input = []
def process_data():
input_values = np.array(input_text.get("1.0", "end-1c").split()) # saves input as array
for x in input_values[1::2]: # getting every second item starting from index #1, so only the numbers
processed_input.append(x) # saves the only numbers containing array
processed_input_2 = np.array(processed_input , dtype="int") # converts array to integer
processed_input_3 = np.split(processed_input_2, [3])
print(processed_input_2)
print(processed_input_3)
input_text = tk.Text(root)
go_button = tk.Button(root, command=process_data, text="Go")
input_text.grid(row=0, column=0)
go_button.grid(row=1, column=0)
root.mainloop()
我觉得你试图一次做太多事情,这与自然顺序相反。我还应该提到,只有当你用numpy数组进行数值计算并使用某种数值类型时,numpy数组才有意义,但只要你在处理字符串列表、更改它们的长度等,就值得坚持使用列表。所以我会把你的函数重写如下:为了消除最终将数组拆分为块的需要,我首先使用splitlines()
,然后在这些块上使用split(' ')
,以自动获得正确的结构。通过使用列表理解,您可以轻松地将包含整数的字符串转换为实际整数。一旦您有一个非粗糙的数字列表,您就可以将其转换为numpy数组。在我看来,提前转换它是没有意义的,因为它们不能像python列表那样收缩或扩展,它总是会创建一个新对象。
def process_data():
lines = input_text.get("1.0", "end-1c").splitlines() # extract lines
values = [[int(v) for v in l.split(' ')[1::2]] for l in lines] # extract numbers, convert the number strings to ints
array = np.array(values, dtype=np.int32)
print(array)