如何在numpy数组中允许浮点数和数组

时间:2016-04-22 12:45:47

标签: python arrays numpy

使用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,以便我可以将简单数字或整数数组作为元素?

非常感谢你的帮助!

3 个答案:

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

最终像我在名单上那样进行了递归处理