Python 如何使用一对嵌套for循环迭代二维数组?
需要从一个数组中获取值,通过一个函数将其放入另一个数组中。这意味着要使用一对嵌套for循环来完成。请帮忙。这里完全是初学者 编辑:好的,澄清一下,我有一个二维数组,里面有各种值。我想对所有这些值应用一个函数,并在值通过函数后返回一个二维数组。我在python中工作。感谢您的快速回复和任何帮助 EDIT3:示例代码: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
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