我编写了一个类似这样的类:
import numpy as np
class blank():
def __init__(self,a,b,c):
self.a=a
self.b=b
self.c=c
n=5
c=a/b*8
if (a>b):
y=c+a*b
else:
y=c-a*b
p = np.empty([1,1])
k = np.empty([1,1])
l = np.empty([1,1])
p[0]=b
k[0]=b*(c-1)
l[0]=p+k
for i in range(1, n, 1):
p=np.append(p,l[i-1])
k=np.append(k,(p[i]*(c+1)))
l=np.append(l,p[i]+k[i])
komp = np.zeros(shape=(n, 1))
for i in range(0, n):
pl_avg = (p[i] + l[i]) / 2
h=pl_avg*3
komp[i]=pl_avg*h/4
self.tot=komp+l
当我这样称呼它的时候:
from ex1 import blank
import numpy as np
res=blank(1,2,3)
print(res.tot)
一切正常。你知道吗
但我想这样称呼它:
res = blank(np.array([1,2,3]), np.array([3,4,5]), 3)
对于这两个数组的每个i
元素,有没有一种简单的方法来调用它而不必编辑类代码?你知道吗
迭代数组列表的唯一方法是在主程序上使用一个函数进行迭代,然后在循环中执行需要执行的操作。你知道吗
此解决方案适用于两个数组的每个元素(注意,如果两个列表的大小都很小,请使用^{} 函数在这两个列表中进行迭代,如本答案here中所列):
希望这是你需要的!你知道吗
如果它只是用两个不同的列表元素调用类,则循环可以很好地满足
您可以看到res变量的值列表
在不更改类代码的情况下,您将无法实例化以NumPy数组作为输入的类。@PabloAlvarez和@NagaKiran已经提供了替代方法:在数组上用
zip
迭代,并为每一对元素实例化类。虽然这是一个非常简单的解决方案,但它无法通过有效的矢量化操作来实现使用NumPy的目的。你知道吗下面是我建议您重写代码的方法:
对于单数和NumPy数组都可以这样调用:
你可以看到结果是一致的。你知道吗
说明:
首先,我想指出的是,
p
、k
和l
的计算不必在循环中。此外,不需要计算k
。如果你仔细看一下,p
和l
的元素是如何计算的,它们只是几何级数(除了p
的第一个元素):因此,可以使用^{} 来代替该循环。不幸的是,} ,它只是一个隐藏的循环…
np.logspace
不支持将base
参数作为数组,因此我们别无选择,只能使用^{尽管
komp
的计算很容易矢量化。你可以在我的例子中看到。那里不需要环路。你知道吗另外,正如我在评论中提到的,你的类不一定是类,所以我冒昧地把它改成了函数。你知道吗
接下来,注意输入参数
c
被覆盖,所以我去掉了它。变量y
从不使用。(同样,您可以按y = c + a * b * np.sign(a - b)
计算)最后,我想指出的是,使用
np.append
创建NumPy数组效率非常低(正如@kabanus所指出的),因此您应该始终尝试一次创建它们—没有循环,没有附加。你知道吗另外:我在代码中使用了
np.atleast_2d
和np.squeeze
,可能不清楚我为什么这么做。它们是避免if else子句的必要条件,在这些子句中我们将检查数组的维数l
。你可以print
中间结果来看看那里到底发生了什么。没什么困难。你知道吗相关问题 更多 >
编程相关推荐