Python - 使用 2d map() 函数式编程
Python - Using 2d map() functional programing
我正在尝试将数组映射到函数。然后将该数组映射到另一个函数,但不确定如何处理映射类型对象或如何映射多维数组。
import numpy as np
import sympy as sp
nn = np.arange(2)
n= len(nn)
x0=0
y0=0
r=10
num=11
def func1(i):
x1, y1 = x0 + r * sp.cos(2 * sp.pi * i / n), y0 + r * sp.sin(2 * sp.pi * i / n)
return np.array([sp.N(x1),sp.N(y1)])
def func2(x1,y1):
x, y = np.linspace(x0, x1, num), np.linspace(y0, y1, num)
return x,y
map1=map(func1,nn)
map2=map(func2,map1[0],map1[1])
希望输出是一个数组[[0,1,2,3,4,5,6,7,8,9,10],[0,0,0,0,0,0,0,0,0,0,0]],[[0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10],[0,0,0,0,0,0,0,0,0,0,0]]
我将其表示为单个循环或列表理解。这两个函数是链接的,没有映射
In [60]: def func1(i):
...: x1, y1 = x0 + r * sp.cos(2 * sp.pi * i / n), y0 + r * sp.sin(2 * sp
...: .pi * i / n)
...: print(x1,y1)
...: return np.array([int(x1),int(y1)])
...:
...: def func2(x1,y1):
...: x, y = np.linspace(x0, x1, num), np.linspace(y0, y1, num)
...: return x,y
...:
...:
In [61]: [func2(*func1(i)) for i in range(2)]
10 0
-10 0
Out[61]:
[(array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]),
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])),
(array([ 0., -1., -2., -3., -4., -5., -6., -7., -8., -9., -10.]),
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]))]
In [62]: np.array(_, int)
Out[62]:
array([[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
[[ 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]])
使用map
:
np.array(list(map(lambda i: func2(*func1(i)), range(2))),int)
sympy
的使用有点晦涩,但显然它是为了获得“精确”的 sin/cos 值 - 但它们仍然必须转换为 int
才能被 numpy
。 sympy
和 numpy
一起使用有很多陷阱。
我正在尝试将数组映射到函数。然后将该数组映射到另一个函数,但不确定如何处理映射类型对象或如何映射多维数组。
import numpy as np
import sympy as sp
nn = np.arange(2)
n= len(nn)
x0=0
y0=0
r=10
num=11
def func1(i):
x1, y1 = x0 + r * sp.cos(2 * sp.pi * i / n), y0 + r * sp.sin(2 * sp.pi * i / n)
return np.array([sp.N(x1),sp.N(y1)])
def func2(x1,y1):
x, y = np.linspace(x0, x1, num), np.linspace(y0, y1, num)
return x,y
map1=map(func1,nn)
map2=map(func2,map1[0],map1[1])
希望输出是一个数组[[0,1,2,3,4,5,6,7,8,9,10],[0,0,0,0,0,0,0,0,0,0,0]],[[0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10],[0,0,0,0,0,0,0,0,0,0,0]]
我将其表示为单个循环或列表理解。这两个函数是链接的,没有映射
In [60]: def func1(i):
...: x1, y1 = x0 + r * sp.cos(2 * sp.pi * i / n), y0 + r * sp.sin(2 * sp
...: .pi * i / n)
...: print(x1,y1)
...: return np.array([int(x1),int(y1)])
...:
...: def func2(x1,y1):
...: x, y = np.linspace(x0, x1, num), np.linspace(y0, y1, num)
...: return x,y
...:
...:
In [61]: [func2(*func1(i)) for i in range(2)]
10 0
-10 0
Out[61]:
[(array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]),
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])),
(array([ 0., -1., -2., -3., -4., -5., -6., -7., -8., -9., -10.]),
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]))]
In [62]: np.array(_, int)
Out[62]:
array([[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
[[ 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]])
使用map
:
np.array(list(map(lambda i: func2(*func1(i)), range(2))),int)
sympy
的使用有点晦涩,但显然它是为了获得“精确”的 sin/cos 值 - 但它们仍然必须转换为 int
才能被 numpy
。 sympy
和 numpy
一起使用有很多陷阱。