Python 在NumPy中使用字符串作为数组索引

Python 在NumPy中使用字符串作为数组索引,python,arrays,numpy,slice,Python,Arrays,Numpy,Slice,我通过GUI在python中处理大型数字数组。 我想将切片功能公开给GUI中的文本框,这样我就可以轻松地选择用于当前计算的数组部分 我想做的简单示例: arr = array([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]) a = "2:4" # example string from GUI Textbox b = "[3, 4, 5]" # example string from GUI Textbox print arr[a] # not valid

我通过GUI在python中处理大型数字数组。 我想将切片功能公开给GUI中的文本框,这样我就可以轻松地选择用于当前计算的数组部分

我想做的简单示例:

arr = array([0, 10, 20, 30, 40, 50, 60, 70, 80, 90])

a = "2:4" # example string from GUI Textbox
b = "[3, 4, 5]" # example string from GUI Textbox


print arr[a] # not valid code -> what should be written here to make it work?
print arr[b] # not valid code -> what should be written here to make it work?
应输出:

[20, 30]
[30, 40, 50]

我发现了slice函数,但是我需要手动解析我的字符串并创建一个slice。有更简单的方法吗?

不,你不能这样做


您必须实现一个函数来解析GUI中的数据,执行一些安全检查,并从数组中获取值。

试试这个,我认为它是有效的,假设您将在字符串中获取最小值和最大值

import re
a = "2:4"
min = int(min(re.findall(r'(\d)',a)))
max = int(max(re.findall(r'(\d)',a)))
print arr[min:max]

可能因为您只需要非常有限的字符集,所以可以使用
eval
这一次:

if not all(c in "1234567890-[],: " for c in b): # maybe also limit the length of b?
    # tell user you couldn't parse and exit this branch
slice_ = eval(f'np.s_[{b}]')
# slice_ can now be applied to your array: arr[slice_]

这只适用于用例a,而不适用于用例b(使用另一个数组进行切片),如果这两个是您唯一的输入,那么您应该有一个逻辑来确定它是数组还是切片类型。然后可以添加if-else条件来处理数据。对于数组类型,同样的代码也可以工作,但只需将最大值增加1,这是否只处理1d数组?不,任意维度(此时最多为第五维度)。请注意,如果start大于stop,它将返回一个空数组<代码>arr[5:2]为空,未引发异常。这就是为什么我要谈论安全性(意味着有效性)。你知道这是一个非常有效和有用的结果吗?
arr[5:2]
没有引发异常是有原因的。原因是它在逻辑上是可以理解的。切片越界返回空列表。它可能对GUI界面无效。您是否意识到在Python 2.7中不能使用f-string
f'np.s{b}'
?我想知道OP是怎么做到的!哈哈哈!这是“在切线上偏离”。然而,我不知道你们在我的声明中特别不理解什么:arr[5:2]是空的,没有提出任何例外。你的问题是多余的:
你知道这是一个非常有效和有用的结果吗?
我出局了!祝您有个美好的一天!