Python 通过循环将三维数组中的每个值传递到函数中

Python 通过循环将三维数组中的每个值传递到函数中,python,function,numpy,loops,Python,Function,Numpy,Loops,情况如下: 我有一个需要8个参数的函数: def BlackScholes(typ, cp ,S0, K, r, q, sigma, T): d1 = (np.log(S0 / K) + (r - q + sigma**2 / 2) * T) / (sigma * np.sqrt(T)) d2 = d1 - (sigma * np.sqrt(T)) if typ=='value': return cp * np.exp(-q * T) * S0

情况如下: 我有一个需要8个参数的函数:

def BlackScholes(typ, cp ,S0, K, r, q, sigma, T): 
    d1  = (np.log(S0 / K) + (r - q  + sigma**2 / 2) * T) / (sigma * np.sqrt(T))
    d2  = d1 - (sigma * np.sqrt(T))
    if typ=='value':
        return cp * np.exp(-q * T) *  S0 * ss.norm.cdf(cp * d1) - cp * K * np.exp(-r * T) * ss.norm.cdf(cp* d2))


现在,我在另一个脚本中使用以下命令调用def函数:

K = WU
while K-BlackScholes('value', -1, S0, K, 0, 0, sigma, T ) < WU:
   K = K+0.01
strikes = [K]
K=WU
而K-BlackScholes('value',-1,S0,K,0,0,sigma,T)
通过上面提到的函数,我得到了一个罢工的值。但是我有一个形状为(8500,1)的sigma数组

我想用sigma数组中的每个值迭代函数。所以我得到了一个与sigma数组形状相同的打击数组。我可以用一个简单的循环来完成它吗?或者我需要在函数中解包数组吗

我已经试过了:

for i in sigma[1,i,:]:
   while K-BlackScholes('value', -1, S0, K, 0, 0, sigma[1,i,:], T ) < WU:
      K = K+0.01
      i = i + 1
strikes = [K]
西格玛[1,i,:]中的i的

而K-BlackScholes('value',-1,S0,K,0,0,sigma[1,i,:],T)
但它也不起作用

我收到以下错误消息:

索引器错误:只有整数、片(
)、省略号(
)、numpy.newaxis(
None
)和整数或布尔数组是有效的索引

如果我插入一个单西格玛值,我会得到一次打击。但是我想迭代数组并将每个sigma值插入函数中。所以我得到了一个对应于sigma列表的罢工数组


sigma.shape(8500,1)->strike.shape(8500,1)

如果函数无法矢量化,则必须将其应用于
sigma
ndarray中的每个值(除非它是1D,否则不要将其称为
list
)。您可以只使用普通Python循环:

strikes = np.ndarray(sigma.shape)
for i in range(sigma.shape[0]):       # or for i in range(8)
    for j in range(sigma.shape[1]):   # ibidem...
      # eventually for k in range...
        K = WU
        while K-BlackScholes('value', -1, S0, K, 0, 0, sigma[i, j, 1], T ) < WU:
           K = K+0.01
        strikes[i, j, 1] = K
strikes=np.ndarray(sigma.shape)
对于范围内的i(sigma.shape[0]):#或范围内的i(8)
对于范围内的j(sigma.shape[1]):#ibidem。。。
#最终k在范围内。。。
K=WU
而K-BlackScholes('value',-1,S0,K,0,0,sigma[i,j,1],T)
您的for循环错误。应该是:

范围内i的
(西格玛形状[1]):
K=WU
而K-BlackScholes('value',-1,S0,K,0,0,sigma[1,i,:],T)
现在你可以得到8号的切片。如果要遍历所有对象,则需要另一个for循环来说明第二个维度:

(已编辑)

K=np.empty_-like(sigma)
对于范围内的j(西格玛形状[0]):
对于范围内的i(西格玛形状[1]):
K[j,i,:]=WU
而K-BlackScholes('value',-1,S0,K[j,i,:],0,0,sigma[j,i,:],T)

但我不确定这是否是您想要的。

是的,这是一个Numpy数组,抱歉!您是否希望
中有多个值?比如,所有满足
K-functionVal
K
都应该在列表中吗?我希望每个输入都有一个击键。所以我想插入sigma中的每一个值,以得到每一个sigma值的罢工。e、 g.我有500个不同的sigma值-->500个罢工,您是否可以发布错误消息和/或预期结果?请参阅我编辑的帖子我尝试了这两种方法,但没有收到错误消息,但我仍然只得到罢工的一个值。我尝试创建一个形状与sigmaI改变它的方式相同的数组(下半部分)。循环运行良好,但我仍然只得到一个单一的罢工值