使用numpy和matplotlib似乎很常见,函数允许数字(float或int)或numpy数组作为参数,如下所示:
import numpy as np
print np.sin(0)
# 0
x = np.arange(0,4,0.1)
y = np.sin(x)
在这个例子中,我使用整数参数调用np.sin一次,使用numpy数组x
调用一次。我现在想写一个允许类似处理的功能,但我不知道怎么做。例如:
def fun(foo, n):
a = np.zeros(n)
for i in range(n):
a[i] = foo
return a
允许我像fun(1, 5)
一样打电话,但不像fun(x, 5)
。当然,我的实际计算要复杂得多。
如何初始化a
,以便我可以将简单数字或整数数组作为元素?
非常感谢你的帮助!
答案 0 :(得分:0)
您需要a
来继承foo
:
def fun(foo, n):
a = np.zeros((n,) + np.shape(foo))
for i in range(n):
a[i] = foo
return a
答案 1 :(得分:0)
内置numpy
函数通常以
def foo(a, ...):
a = np.asarray(a)
...
也就是说,它们将输入参数转换为数组(如果已经是数组,则不进行复制)。允许他们使用标量和列表。
一旦参数是一个数组,它就有一个形状,可以与其他参数一起广播。
在你的例子中,当foo
是一个数组时,它不清楚应该发生什么
def fun(foo, n):
a = np.zeros(n)
for i in range(n):
a[i] = foo
return a
a
初始化为dtype float数组。这意味着a[i]=foo
仅在foo
是单个元素编号(标量,可能是单个元素数组)时才有效。如果foo
是一个具有多个值的数组,则可能会出现关于尝试使用序列设置元素的错误。
a[i]
是a[i,...]
的缩写。那就是它在第一维上的索引。因此,如果a
正确初始化,它可以接受数组作为输入(受广播规则约束)。
如果a
被初始化为np.zeros(n, dtype=object)
,则a[i]=foo
将适用于任何内容,因为a
只包含指向Python对象的指针。
np.frompyfunc
是一种从函数生成数组的方法。但它返回一个dtype = object数组。 np.vectorize
使用它,但可以让您更好地控制输出类型。但两者都与标量一起使用。如果作为参数给出,则数组将逐个元素传递给函数。
答案 2 :(得分:-1)
您可以使用类型识别:
import numpy as np
def double(a):
if type(a)==int:
return 2*a
elif type(a)==float:
return 2.0*a
elif type(a)==list:
return [double(x) for x in a]
elif type(a)==np.ndarray:
return 2*a
else:
print "bad type"
print double(7)
print double(7.2)
print double([2,9,7])
print double(np.array([[9,8],[2,3]]))
结果:
>14
>14.4
>[4, 18, 14]
>[[18 16]
[ 4 6]]
最终像我在名单上那样进行了递归处理