Python 如何使用一对嵌套for循环迭代二维数组?

Python 如何使用一对嵌套for循环迭代二维数组?,python,arrays,for-loop,numpy,Python,Arrays,For Loop,Numpy,需要从一个数组中获取值,通过一个函数将其放入另一个数组中。这意味着要使用一对嵌套for循环来完成。请帮忙。这里完全是初学者 编辑:好的,澄清一下,我有一个二维数组,里面有各种值。我想对所有这些值应用一个函数,并在值通过函数后返回一个二维数组。我在python中工作。感谢您的快速回复和任何帮助 EDIT3:示例代码: import numpy as N def makeGrid(dim): ''' Function to return a grid of distances from t

需要从一个数组中获取值,通过一个函数将其放入另一个数组中。这意味着要使用一对嵌套for循环来完成。请帮忙。这里完全是初学者

编辑:好的,澄清一下,我有一个二维数组,里面有各种值。我想对所有这些值应用一个函数,并在值通过函数后返回一个二维数组。我在python中工作。感谢您的快速回复和任何帮助

EDIT3:示例代码:

import numpy as N

def makeGrid(dim):
    ''' Function to return a grid of distances from the centre of an array.
    This version uses loops to fill the array and is thus slow.'''
    tabx = N.arange(dim) - float(dim/2.0) + 0.5
    taby = N.arange(dim) - float(dim/2.0) + 0.5
    grid = N.zeros((dim,dim), dtype='float')
    for y in range(dim):
        for x in range(dim):
            grid[y,x] = N.sqrt(tabx[x]**2 + taby[y]**2)
    return grid

import math

def BigGrid(dim):
    l= float(raw_input('Enter a value for lambda: '))
    p= float(raw_input('Enter a value for phi: '))
    a = makeGrid 
    b= N.zeros ((10,10),dtype=float) #Create an arry to take the returned values
    for i in range(10):
        for j in range (10):
            b[i,j] = a[i][j]*2


if __name__ == "__main__":
    ''' Module test code '''
    size = 10 #Dimension of the array
    newGrid = BigGrid(size)
    newGrid = N.round(newGrid, decimals=2)
    print newGrid
for(int i;i

诸如此类?

从问题的上下文和
2d数组的典型含义来看,您似乎正在尝试执行以下操作:

>>>> array2d = [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
>>> def add_two( v ):
...     return v + 2
... 
>>> [ [ add_two( v ) for v in row ] for row in array2d ]
[[2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6]]
a = makeGrid(dim)

上面使用的列表理解与使用两个嵌套for循环相同,在本例中更具可读性,并且在描述列表而不是构建列表时,涉及的
list
方法的直接交互更少。

这里是一行双映射

map(lambda x:map(func, x), l)
例如:

l=[[1,2,3],[4,3,1]]
map(lambda x:map(lambda x:x*10,x),l)

[[10, 20, 30], [40, 30, 10]]

这可能是我要做的…

使用嵌套循环很容易做到:

def my_function(n): # n will become y from the next part
   new_num = # do whatever you want with it
   return new_num

my_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # just an example
new_list, final_list = [], [] # multiple assignment
for x in my_list:
   print x
   new_list = []
   for y in x:
      # y is now the first value of the first value of my_list--- 1.
      my_num = my_function(y)
      new_list.append(my_num)
   final_list.append(new_list)
print final_list
应该这样做


返回:
[[2,3,4],[5,6,7],[8,9,10]

根据您的问题,您似乎正在使用Numpy。如果你不太关心速度,你可以简单地用numpy数组调用函数;该函数将为您操作整个阵列

没有必要显式地编写迭代,但是如果您能够找到一种方法来利用numpy的特殊特性,那么这将比使用设计为一次操作一个元素的函数更快。但是,除非您使用的是非常大的数据集,否则这应该很好:

import numpy as np
>>> g = np.array( [ [1,2,3], [ 4,5,6] ] )
array([[1, 2, 3],
       [4, 5, 6]])
>>> def myfunc( myarray ):
...     return 2 * myarray
... 
>>> myfunc(g)
array([[ 2,  4,  6],
       [ 8, 10, 12]])

首先,您的代码中有一个bug,如下所示:

a = makeGrid
您正在将
a
设置为函数,而不是数组。你应具备以下条件:

>>>> array2d = [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
>>> def add_two( v ):
...     return v + 2
... 
>>> [ [ add_two( v ) for v in row ] for row in array2d ]
[[2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6], [2, 3, 4, 5, 6]]
a = makeGrid(dim)
这就是为什么在@abought尝试答案时出现
TypeError

现在,在numpy中应用操作元素wise有很多可能性。如果要对数组中的每个元素执行相同的操作,最简单的方法是使用数组操作:

b = a * 2
(请注意,您不需要事先声明
b
,也不需要任何循环。)Numpy还有许多C优化函数,它们对数组的每个元素执行相同的操作。这些被称为。您可以组合UFUNC以获得按元素计算的复杂表达式。例如:

b = N.sin(a**2) + N.log(N.abs(a))
通过使用数组操作和numpy,还可以更高效地创建来自
makeGrid()
a
数组:

如果要对每个数组元素执行不同的操作,事情会变得更加复杂,可能无法避免循环。对于这些情况,numpy有一种方法可以使用or分解nD数组上的循环。您使用
ndenumerate
的示例:

for index, x in N.ndenumerate(a):
    b[index] = x * 2

这比多个循环快,但应尽可能使用数组操作。

两个数组与“2d”数组不同。你能更具体地说明你想做什么吗?也许可以分享你迄今为止所做的尝试?你用的是什么语言?非常模糊的描述我会说你的两个数组是二维的吗?是的,二维数组。查看EDIT3中的代码。这有意义吗?它给了我以下错误“function”对象没有属性“getitem”确定,以澄清我有一个包含各种值的二维数组。我想对所有这些值应用一个函数,并在值通过函数后返回一个二维数组。我在python中工作。感谢您的快速回复和任何帮助!我刚得到TypeError:不支持*:'int'和'function'的操作数类型您确定没有键入“return 2*myfunc”吗?上面的代码片段和结果是直接从我的终端粘贴的(使用“import numpy as np”),但是如果这个bug是特定于您的实现的,我们可以进一步研究它。非常确定。我稍微改变了策略,但当我尝试下面的代码时,我只得到了“function”对象没有属性“getitem”。新代码是EDIT3
for index, x in N.ndenumerate(a):
    b[index] = x * 2