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



需要从一个数组中获取值,将它们放入一个函数,然后将它们放入另一个数组。这意味着使用一对嵌套的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
def map_row(row):
return map(some_function,row)
map(map_row,my_2d_list)

可能是我会怎么做…

根据您的问题,您似乎在使用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]])

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

a = makeGrid

您将a设置为函数,而不是数组。你应该有以下内容:

a = makeGrid(dim)

这就是为什么当你尝试@abought的答案时,你得到了TypeError

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

b = a * 2

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

b = N.sin(a**2) + N.log(N.abs(a))

使用数组操作和numpy的mgrid:也可以更有效地创建makeGrid()中的a数组

grid = N.mgrid[-dim//2 + 1:dim//2:0.5, -dim//2 + 1:dim//2:0.5]
grid = N.sqrt(grid[0]**2 + grid[1]**2)

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

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

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

根据问题的上下文,以及2d-array通常意味着什么,您似乎正在尝试执行以下操作:

>>>> 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]]

上面使用了一个列表理解,它与使用两个嵌套的for循环相同,在这种情况下更具可读性,并且在描述list而不是构建它时,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]]

for(int i; i < x; i++)
for(int j; j < y; j++)
array2[i][j] = func(array2[i][j])

是这样的吗?

最新更新