【问题标题】:How to solve ValueError in Python? [duplicate]如何解决 Python 中的 ValueError? [复制]
【发布时间】:2021-12-19 15:26:51
【问题描述】:

我该如何解决这个错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all().

这是有错误的行:

Kz=(2.01*(max(4.75,z)/zg)**(2/a)*kz_StdRnd[j])

Python:

n_samples=20000 
a1= np.random.uniform(0,1,(n_samples,1))
a10 = np.linspace(1,20000,num=20000)-1+a1/n_samples
kz_StdRnd = 1+0.16*norm.ppf(a10,0.0,1.0)
kz_StdRnd = kz_StdRnd[np.random.permutation(n_samples)]

for j in range(n_samples):
    a=9.5 
    zg=274.32 
    Kz=(2.01*(max(4.75,z)/zg)**(2/a)*kz_StdRnd[j])

【问题讨论】:

  • 当你在一行上有一个巨大的方程时,真的很难调试。如果你把它分成多行,你将能够真正看到它的哪一部分导致了错误。
  • 请提供完整的minimal reproducible example - 阅读How to Ask
  • 错误在最后一行,用于在for循环中计算KZ。
  • @saeed 你已经说过了,我知道。我是说那条线发生了很多事情,如果你把那条线分成多条线,就可以准确地知道那条线的哪一部分导致了错误。例如,不是x = f*g/h**(2/i),而是a=2/ib=h**ac=f*gx=c/h 之类的单独行。
  • 最后一行中的所有内容都是标量,z 除外。那是一个数组吗? max(4.75, np.zeros((3,))) 似乎复制了您的问题,并且是 THE 我们需要的最小可复制示例。假设 z 是一个数组,您期望 max 调用的结果是什么?

标签: python valueerror


【解决方案1】:

好像你没有正确使用 np.random.permutation https://numpy.org/doc/stable/reference/random/generated/numpy.random.permutation.html

此函数接受一个数组或 int,然后返回 ndarray。

问题是数组被用作索引。我不认为这是正常的。

kz_StdRnd 是一个函数吗? 然后你应该使用 map 将该函数应用于排列数组。

kz_StdRnd = list(map(kz_StdRnd, np.random.permutation(n_samples)))

而不是

kz_StdRnd = kz_StdRnd[np.random.permutation(n_samples)]

我模仿了您的代码并进行了一些修改,以使其至少可以无错误地运行。我很确定结果不是你想要的。

  1. 我在同一个模块中将 ppf 函数更改为 pdf 函数。你可能想看看这个页面。 ppf 功能似乎有问题。

https://github.com/scipy/scipy/issues/2888

  1. 我将最后一个代码中的“z”变量更改为“zg”

这是代码:

from scipy.stats import norm
import numpy as np
n_samples=20000
a1 = np.random.uniform(0,1,(n_samples,1))
a10=np.linspace(1,20000, num=n_samples)-1+a1/n_samples
#print(type(a10))
k=1+0.16*norm.pdf(a10,0,1)
p=np.random.permutation(n_samples)
#print("p: ", p)
#print("k: ", k)
k = k[p]
#print("k:", k)
for j in range(n_samples):
    a=9.5
    zg=274.32
    kz=(2.01*(max(4.75,zg)/zg)**(2/a)*k[j])

【讨论】:

  • 实际上,这是我从 Matlab 转换为 Python 的代码。我不确定它是否是一个函数。 Matlab代码是这样的:
  • kz_StdRnd = kz_StdRnd(randperm(n_samples))
  • kz_StdRnd 是一个数组,因为它是使用scipy.stats.norm.ppf 创建的,所以他在这里正确使用了方括号。
  • @Reti43 这是一个很难回答的问题。 1. 最后一行的“z”是什么?因为在给定的代码中没有这样的变量。也许是“zg”的错字?顺便说一句,ppf 功能似乎没有按预期工作。我用 n_samples=20 模仿了代码,并且 kz_StdRnd 除了每行的第一个元素外,都充满了 NaN。这可能就是它给出错误的原因。 github.com/scipy/scipy/issues/2888 这个链接可能是相关的,我应用了 pdf 函数,并将神秘的 'z' 替换为 'zg'。现在代码至少“运行”了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多