假设我有一个任意数组的变量N.例如: A是一个2x3x3数组,是一个3阶数组,其中包含2,3和3个指数。
我想有效地遍历每个元素。如果我先知道订单,那么我可以做一些事情(在python中),
#for order 3
import numpy as np
shape = np.shape(A)
i = 0
while i < shape[0]:
j = 0
while j < shape[1]:
k = 0
while k < shape[2]:
#code using i,j,k
k += 1
j += 1
i += 1
现在假设我不知道A的顺序,即我不知道shape
的长度的先验。如何通过数组的所有元素置换最快的速度?
答案 0 :(得分:0)
有很多方法可以做到这一点,例如:迭代a.ravel()
或a.flat
。但是,在Python循环中循环遍历数组的每个元素将永远不会特别有效。
答案 1 :(得分:0)
我不认为你选择先排除哪个索引,选择哪个索引来排除第二个等等是很重要的,因为你最内层的while语句将始终按{{1}的组合执行一次},i
和j
。
答案 2 :(得分:0)
如果格式为array = [[[1,2,3,4],[1,2]],[[1],[1,2,3]]]
您可以使用以下结构:
array = [[[1,2,3,4],[1,2]],[[1],[1,2,3]]]
indices = []
def iter_array(array,indices):
indices.append(0)
for a in array:
if isinstance(a[0],list):
iter_array(a,indices)
else:
indices.append(0)
for nonlist in a:
#do something using each element in indices
#print(indices)
indices.append(indices.pop()+1)
indices.pop()
indices.append(indices.pop()+1)
indices.pop()
iter_array(array,indices)
这应该适用于通常的嵌套列表“数组”我不知道是否可以使用numpy的数组结构来模仿它。
答案 3 :(得分:0)
如果你需要保留你的操作结果(并假设它是A和i,j,k的函数)你想要使用这样的东西:
import itertools
import numpy as np
results = ( (position, code(A,position))
for indices in itertools.product(*(range(i) for i in np.shape(A))))
然后,您可以迭代结果,获取位置并返回每个位置的代码值。或者,如果需要多次访问结果,请将生成器表达式转换为列表。