Skip to main content
 首页 » 编程设计

python之如何在 numpy 数组中同时允许 float 和数组

2025年05月04日11daizhj

使用 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,但不能像 fun(x, 5) 那样调用。当然,我的实际计算要复杂得多。

如何初始化 a 以便我可以将简单数字或整个数字数组作为元素?

非常感谢您的帮助!

请您参考如下方法:

内置 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 使用它,但可以让您更好地控制输出类型。但两者都适用于标量。数组(如果作为参数给出)将逐个元素传递给函数。