对于这个例子,我有一个包含变量名称的文件,例如foo或bar [4] [5],其中名称可能有也可能没有可变数量的索引,因为变量可能是多维数组。字典里面还有每个变量的起始内存地址,以及它的值类型,例如int_32或signed_int_64等。
我的程序应该打印出每个变量,任何数组的每个组件,其内存地址及其值。问题是,我该如何处理数组?它们可以是一维的,二维的,十二维的,甚至是零维的(单值),但我需要用一个程序来完成它们。另一个重要因素是使程序足够稳健以承受任何数量的维度。
答案 0 :(得分:1)
我的解决方案是取名称并检查它是否与另一个stackoverflow用户提供的正则表达式匹配。以下代码应记入Lib。
def getEntryName(var_string) : # From LIB @ Stackoverflow.com
result = re.search(r'(.*?)((?:\[\d*])*)$', var_string)
var_name = result.group(1)
numbers = re.findall(r'\[(\d+)]', result.group(2))
return var_name, numbers
这将返回变量的基本名称和名为“numbers”的列表,其中包含所有数组的所有索引。
现在我使用了一个recurvise调用来查找迭代任意数量的索引!
def BracketHandler( PassedRange, var_name, var_Length, var_startA, numbers )
for i in range( 0, int( PassedRange ) - 1 ) : # We cycle through it!
if numbers : # If there are more indexes to cycle through,
BracketHandler( numbers[0], var_name + "[" + str( i ) + "]",
var_Length, var_startA, numbers[1:] )
else: # Exit Condition
ProcessVar(var_name + "[" + str( i ) + "]",
var_Length,var_startA) var_startA + = var_length
现在解释我的代码。基本上,在运行此函数之前,我检查以确保数字中有任何内容,如果有,我将这个递归函数传递给数字中的第一个值,变量的名称,长度和起始地址以及最后的其余数字(哪个mich = [])一旦那里,我遍历当前索引。接下来我检查集合中是否有更多数字,如果有,我将当前索引添加到名称上,然后再次运行该函数,直到没有新数字为止。
此时,由于没有新的数字,我处理另一个函数中的变量,并启动起始地址。并且中提琴!
如果此代码采用类似foo的名称和一组数字,如[4,6,8],它将产生:
foo[0][0][0]
foo[0][0][1]
...
foo[0][0][7]
foo[0][1][0]
...
foo[3][5][7]
并将所有内容发送给正确的值进行处理!
可能有更好的解决方案,但我找不到任何解决方案。为了让它尽可能地发挥作用,我对它进行了长时间的修改,虽然对某些人来说似乎很明显,但当时这一点并不那么明显。如果您有任何改进建议,我欢迎它。如果我所做的任何错误,请随时编辑我的错误。如果这不是做Q& A的合适方式,请告诉我,我会删除它!
答案 1 :(得分:1)
另一种可能性是使用itertools.product代替递归来获取所有坐标。对于(例如)[1,3,4]
的数字,您基本上需要笛卡尔积[{1}},这正是[0] x [0,1,2] x [0,1,2,3]
的用途:
例如:
itertools.product
(请注意,>>> from itertools import product
>>> numbers = [1, 3, 4]
>>> product(*(range(n) for n in numbers))
<itertools.product object at 0x101abb640>
>>> list(product(*(range(n) for n in numbers)))
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 0), (0, 2, 1), (0, 2, 2), (0, 2, 3)]
基本上是f(*(a,b,c))
。)
将整个事物包装成发电机:
f(a,b,c)
会给我们
def all_coords(name, numbers):
coords = product(*(range(n) for n in numbers))
for coord in coords:
yield name + ''.join('[{}]'.format(c) for c in coord)
答案 2 :(得分:0)
使用 np.ndenumerate
。例如:
for ind,value in np.ndenumerate(myarray):
print ind, value
将循环遍历数组,将ind
作为元组,一维数组为(i,)
,2D为(i,j)
,3D为(i,j,k)
等等...,您可以访问始终从数组中检索的数据,如:
`myarray[ind]`
允许您对任何数组进行一般循环...