需要从一个数组中获取值,将它们放在一个函数中并将它们放在另一个数组中。它意味着使用一对嵌套的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
答案 0 :(得分:1)
def map_row(row):
return map(some_function,row)
map(map_row,my_2d_list)
我可能会这样做......
答案 1 :(得分:1)
根据您的问题,您似乎正在使用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]])
答案 2 :(得分:1)
首先,您的代码中存在以下行中的错误:
a = makeGrid
您将a
设置为函数,而不是数组。你应该有以下内容:
a = makeGrid(dim)
这就是为什么当你尝试@abought的答案时你有TypeError
。
现在,要在numpy中应用元素操作,有很多可能性。如果要对数组中的每个元素执行相同操作,最简单的方法是使用数组操作:
b = a * 2
(注意,您不需要事先声明b
。而且您也不需要任何循环。)Numpy还有许多C优化函数,它们对数组的每个元素执行相同的操作。这些被称为ufuncs。您可以组合ufunc来获取以元素方式评估的复杂表达式。例如:
b = N.sin(a**2) + N.log(N.abs(a))
使用数组操作和numpy的mgrid
也可以更有效地创建来自a
的{{1}}数组:
makeGrid()
如果要对每个数组元素执行不同的操作,事情会变得更复杂,并且可能无法避免循环。对于这些情况,numpy有一种方法可以使用ndenumerate
或ndidex
来分解nD数组上的循环。您的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)
示例:
ndenumerate
这比多个循环更快,但应尽可能使用数组操作。
答案 3 :(得分:0)
从问题的背景方面我可以得到的内容以及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
方法的直接交互较少。而不是建立它。
答案 4 :(得分:0)
这是一张带双地图的单行
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]]
答案 5 :(得分:0)
使用嵌套循环很容易做到:
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]]
。
答案 6 :(得分:-2)
for(int i; i < x; i++)
for(int j; j < y; j++)
array2[i][j] = func(array2[i][j])
那样的东西?